try{
普通
}catch(){
何かあった
}
こうすることでif文を大量に書かずに済む。
どんな例外がおこったかわかるように、例外状況をあらわすクラスがあらかじめ用意されている。
例外Ⅰ Error系例外
回復見込みなし。メモリが足りないみたいな。クラスファイルが壊れているとか。どうしようもないのでcatchしない。
Ⅱ Exception系例外
対処可能。catchする。
Ⅲ runtime系例外
catchしない。
ばってんのでるコード↓
--->Main574.java
import java.io.FileWriter;
public class Main574 {
public static void main(String[] args) {
FileWriter fw = new FileWriter("data.txt");
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
処理されない例外の型 IOException
at Main574.main(Main574.java:6)
教科書のエラーと違うな。
開きたいファイルを指定してファイルライターというクラスのに入れる。
ちなみに教科書のimport java.io.*;とは
ioシリーズを全部読み込んでくださいという意味。
実際これ↑をうちこむと
import java.io.FileWriter;
import java.io.IOException;
に勝手に変換されるが、特に問題ないらしい。
読み込みたいファイルがなかった場合は実は自動で生成される。
だから成功しましたと表示される。
data.txtが作られているのがわかる。
じゃあわざとエラーを出したいので data.txtをメモ帳で開いた状態にしてもう一回やってみましょう。
→
エラーでない
サクラエディタで開こう
→
エラーが出た
めっさおこられる
error
java.io.FileNotFoundException: data.txt (プロセスはファイルにアクセスできません。別のプロセスが使用中です。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at java.io.FileWriter.<init>(FileWriter.java:63)
at Main574.main(Main574.java:9)
実際エラー発生したのは、エラーメッセージの最終行の9のとこの。
e.printStackTrace();
システム側のエラーを表示するメソッド。
エクセプション例外がとらいきゃっちでキャッチできるようになっている。
APIをよめ
しかし普通はエクリプスが解決策提示をしてくれる
引数リストのあとにすろーず例外クラス名と表記されている
tryブロック実行中はJVMがなんかおこるかなと注意している。
なんかあったら即catchに移行するが
そのときどういう理由で例外がおきたのかがeに格納されるらしい。
--->
import java.io.FileWriter;
import java.io.IOException;
public class Main574 {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("data.txt");
System.out.println("ok");
}catch (IOException e) {
System.out.println("error");
System.out.println(e.getMessage());
//e.printStackTrace();
}
}
}
実行結果
error
data.txt (プロセスはファイルにアクセスできません。別のプロセスが使用中です。)
getMessage()のほかに
すたっくとれーすというのもある
追跡。
e.printStackTrace();
いつもの。
教科書p630
スタックトレースのよみかた
--->main582.java
import java.io.FileWriter;
import java.io.IOException;
public class Main582 {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("data.txt");
System.out.println("ok");
fw=null;//わざと
fw.write("hello");//ファイルに書き込み
fw.close();
}catch (IOException e) {//ファイルが他人が開いた状況だとここにおちる
System.out.println("error");
System.out.println(e.getMessage());
//e.printStackTrace();
}catch (NullPointerException e) {//ファイルがnullだとここにおちる
System.out.println("error"+e.getMessage());
}
}
}
実行結果
ok
errornull
okがでたのは先にそこを通ったから。
そのあと2つめのcatchにおちた。
catch文はいくつもかける
ざっくりと補足できる
--->Main582_02.java
import java.io.FileWriter;
public class Main582_02 {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("data.txt");
System.out.println("ok");
fw=null;//わざと
fw.write("hello");//ファイルに書き込み
fw.close();
}catch (Exception e) {
System.out.println("なんやしらんが例外やで");
}
}
}
もちろん全部を併記しておくこともできる
}catch (Exception e) {
System.out.println("なんやしらんが例外やで");
System.out.println(e.getMessage());
e.printStackTrace();
}
実行結果(null)
ok
なんやしらんが例外やで
null
java.lang.NullPointerException
at Main582_02.main(Main582_02.java:13)
実行結果(ファイルひらきっぱなし)
なんやしらんが例外やで
data.txt (プロセスはファイルにアクセスできません。別のプロセスが使用中です。)
java.io.FileNotFoundException: data.txt (プロセスはファイルにアクセスできません。別のプロセスが使用中です。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at java.io.FileWriter.<init>(FileWriter.java:63)
at Main582_02.main(Main582_02.java:8)
しかしお客さんがこんなのをみたら仰天するので、
エラー002です どこそこにご連絡ください
とかふつうはだす訳です。
また、じゃあ別のファイルをひらくかねとかいう処理をしたいとなれば、そういうものにあわせた数のcatchをやはり書く必要がある。
ファイルは開けたら閉じるのがきまり。
閉じ忘れはだめなのだ。