目次
1.throw
2.throws
3.try-catch文のネスト
4.複数の例外を一気にキャッチする
※「try-catch文の使い方まとめ①」はこちら↓
1. throw
tryブロック内のthrow
package jp.co.study.sample;
public class Qiita {
public static void main (String args[]) {
String str1 = "おさかな";
try {
Double.parseDouble(str1);
System.out.println(str1 + ":この文字列は数字です");
throw new NumberFormatException();
} catch (NumberFormatException e) {
System.out.println(str1 + ":この文字列は数字ではありません");
}
}
}
tryブロック内にthrowを記載することで、任意の場所で例外を発生させたり、
意図的に例外を発生させたりすることができる。
出力結果は「おさかな:この文字列は数字ではありません」
catchブロック内のthrow
package jp.co.study.sample;
public class Qiita {
public static void main (String args[]) {
String str1 = "おさかな";
try {
Double.parseDouble(str1);
System.out.println(str1 + ":この文字列は数字です");
} catch (NumberFormatException e) {
throw e;
}
}
}
catchブロック内にthrowを記載することで、キャッチした例外そのものをスローすることができる。
出力結果は
「Exception in thread "main" java.lang.NumberFormatException: For input string: "おさかな"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:543)
at jp.co.study.sample.Qiita.main(Qiita.java:9)」
2. throws
package jp.co.study.sample;
public class Qiita {
public static void main (String args[]) {
try {
// 文字列チェックメソッド呼び出し
strCheck("おさかな");
} catch (NumberFormatException e) {
System.out.println("この文字列は数字ではありません");
}
}
// 文字列チェックメソッド
private static void strCheck(String str1) throws NumberFormatException {
Double.parseDouble(str1);
}
}
まずは処理の流れ。文字列チェックメソッドのstrCheckを呼び出し、
引数で渡している "おさかな" が文字列かどうかのチェックをおこなう。
DoubleクラスのparseDoubleメソッドを使用し、文字列を数値のDouble型に変換。
数字でない文字列やnullは変換不可のため、NumberFormatExceptionがスローされる。
スローされたNumberFormatExceptionはstrCheck呼び出し元のcatchブロックでキャッチされ、
「この文字列は数字ではありません」が出力される。
throwsは、メソッド内で例外が発生する可能性がある場合、メソッドの定義部分に宣言するもの。
呼び出し元などで例外を処理したい場合などに使用。(メソッド内で例外を処理することも可能)
3. try-catch文のネスト
try、ctach、finallyブロックのどの中でもネストすることが可能。
tryブロックでのネスト
package jp.co.study.sample;
public class Qiita {
public static void main (String args[]) {
String str1 = null;
try {
try {
str1.length();
} catch (NullPointerException e){
System.out.println("str1はnullです");
return;
}
Double.parseDouble(str1);
System.out.println(str1 + ":この文字列は数字です");
} catch (NumberFormatException e) {
System.out.println(str1 + ":この文字列は数字ではありません");
}
}
}
Stringクラスのlengthメソッドを使用し文字列の長さを取得。
str1はnullのためNullPointerExceptionが発生し、ひとつ目のcatchブロックに入る。
出力結果は「str1はnullです」。
ctachブロックでのネスト
package jp.co.study.sample;
public class Qiita {
public static void main (String args[]) {
String str1 = null;
try {
str1.length();
} catch (NullPointerException e1) {
str1 = "おさかな";
try {
Double.parseDouble(str1);
System.out.println(str1 + ":この文字列は数字です");
} catch (NumberFormatException e2){
System.out.println(str1 + ":この文字列は数字ではありません");
}
}
}
Stringクラスのlengthメソッドを使用し文字列の長さを取得。
str1はnullのためNullPointerExceptionが発生し、ひとつ目のcatchブロックに入る。
str1に代入された文字列は数字でないため、parseDoubleでの数値変換時にNumberFormatExceptionが発生。
そのため出力結果は「おさかな:この文字列は数字ではありません」。
(※finallyブロックでのネストの実装例については割愛させていただきます。)
4. 複数の例外を一気にキャッチする
package jp.co.study.sample;
public class Qiita {
public static void main (String args[]) {
String str1 = null;
try {
Double.parseDouble(str1);
System.out.println(str1 + ":この文字列は数字です");
} catch (NumberFormatException | NullPointerException e) {
System.out.println(e + "が発生しました");
}
}
}
str1はnullのため、parseDoubleでの数値変換時にNumberFormatExceptionが発生。
出力結果「java.lang.NullPointerExceptionが発生しました」。
関連記事