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をやはり書く必要あり。
ファイルはあけたらとじるのがきまり
とじわすれはだめなのだ。
きょうはつかれすぎていてのうのめもりがたりない ぐあいがわるいな ひらがな多用で失礼。