忍者ブログ

からすまる日誌

2020022002 try-catch

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2020022002 try-catch

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をやはり書く必要あり。
 

ファイルはあけたらとじるのがきまり
とじわすれはだめなのだ。
 
きょうはつかれすぎていてのうのめもりがたりない ぐあいがわるいな ひらがな多用で失礼。
 
PR

コメント

ブログ内検索

カレンダー

03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30