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

## 目次
　[1.throw](#1-throw)
　[2.throws](#2-throws)
　[3.try-catch文のネスト](#3-try-catch文のネスト)
　[4.複数の例外を一気にキャッチする](#4-複数の例外を一気にキャッチする)


※「try-catch文の使い方まとめ①」はこちら↓


https://qiita.com/osakanaaaa/items/860eb34aa0b19b5b62c3



## 1. throw
### tryブロック内のthrow
```java
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
```java
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
```java
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ブロックでのネスト
```java
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ブロックでのネスト
```java
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. 複数の例外を一気にキャッチする
```java
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が発生しました」。

## 関連記事

https://qiita.com/osakanaaaa/items/dc98efab6b490905e57d