0
1

More than 1 year has passed since last update.

try-catch文の使い方まとめ②

Last updated at Posted at 2022-12-22

目次

 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が発生しました」。

関連記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1