フリーでしごと:
10日でできる案件は
→1.5をかける
→15日でできるよ15日ぶんおかねください
という。
さて
import java.io.FileWriter;
public class Main582_02 {
public static void main(String[] args) {
FileWriter fw = null;//nullで初期化
try {
fw = new FileWriter("data.txt");
System.out.println("ok");
//fw=null;//わざと
fw.write("hello");//ファイルに書き込み
fw.close();
}catch (Exception e) {
System.out.println("なんやしらんが例外やで");
System.out.println(e.getMessage());
e.printStackTrace();
}
fw.close();
}
}
tryしてもcatchしてもクローズさせようとこう書くと
ここのfw.close();でばってんがつく。
なぜならこのクローズが成功するとも限らないため。
なので、
try{
}catch(){
}finally{
}
と記述する。
こともあろうにこういう構成になる。
import java.io.FileWriter;
import java.io.IOException;
public class Main582_02 {
public static void main(String[] args) {
FileWriter fw = null;//nullで初期化
try {
fw = new FileWriter("data.txt");
System.out.println("ok");
//fw=null;//わざと
fw.write("hello");//ファイルに書き込み
//fw.close();
}catch (Exception e) {
System.out.println("なんやしらんが例外やで");
System.out.println(e.getMessage());
e.printStackTrace();
}finally{
try {
fw.close();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}
結局finallyでも、もういちどクローズ失敗時のためにtry-catchが必要になっている。
しかし実はファイルクローズは記述しなくてもかならず実行されるように仕様変更になったらしい。
あらまあ。
じゃあmainがよびだすsubがよびだすsubsubで例外が発生したら?
→
subsubにtry-catchがなければsubに丸投げ
subでもキャッチできなければmainに丸投げ
こういうたらい回しを例外の伝播という
public static void subsub() throws Exception{
すろーずえくせぷしょん:
エラーが発生してもしらんわ呼び出し元に丸投げするよという意味
下位でエラー処理してるとかえってややこしい構造になるらしい。いくつかのメソッドを呼び出してる元でまとめてtry-catchしたりするらしい。
とはいえふつうmainではやらないらしい。
※もし仮にこの一文がなく、subsubで予想外のことが起こると、subsubでエラーですわと出てくる。
throwsと、そっくりだがsのついてない、まったく別のthrowというのがある
JVM(ジェイブイエム)さんが監視しているエラーの見張りのほかに、自分で自発的にエラーをジェイブイエムさんにエラー発生ですわと報告するやり方。
オリジナルの例外処理を用意しておくみたいな。
このへん授業ではだいぶはしょった。
public class Main595{
public static void main(String[] args) {
try{
// 試験的にいきなり例外を発生させる
throw new UnsupportedMusicFileException("未対応のファイルです");
} catch(Exception e){
e.printStackTrace();
}
}
}
--->
public class Person{
int age;
public void setAge(int age) {
if(age < 0) { // ここで引数をチェック
throw new IllegalArgumentException("年齢は正の数を指定すべきです。指定値=" + age);
}
this.age = age; // 問題ないなら、フィールドに値をセット
}
}
年齢がマイナスはありえないので、
→あらかじめ自分でthrowを設定