はじめに
今回の記事はthrow、throwsの解説を簡潔に書くことを目的としているため、検査例外・非検査例外とは何か等の細かい内容は省かせていただきます。お許しを。
実行環境
OS:Windows10 バージョン20H2
言語:Java 8
使用ツール:Spring Tool Suite 4
1. throw
1-1. throwとは
例外を意図的に起こすことが出来る処理のこと。
1-2. 使い方
throw new 例外クラス名();
1-3. 使用例
public class Sample {
public void hello(String name) {
if (name == null) {
throw new IllegalArgumentException();
}
System.out.println(name + "さん、こんにちは!");
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
s.hello(null);
}
}
実行結果
Exception in thread "main" java.lang.IllegalArgumentException
何らかの名前(文字列)を受け取ったら「こんにちは!〇〇さん!」と画面に表示するhelloメソッド
を作るとします。
しかしこの場合helloメソッド
の引数にnull
を渡したとしても、「こんにちは!nullさん!」と表示されてしまいます。
そこで、Sampleクラス
にて「もしname
の値がnull
だった場合、throw
を用いてIllegalArgumentException
という非検査例外を発生させる」というプログラムを組み、例外を意図的に発生させています。
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
try {
s.hello(null);
} catch (IllegalArgumentException e){
System.out.println("名前が空です!");
}
}
}
実行結果
名前が空です!
try-catch
を用いることで、上記のコードのように意図的に起こした例外に対して処理を組むことも可能です。
2. throws
2-1. throwsとは
メソッド内でスローする可能性のある例外を宣言する処理のこと。
※ 扱う例外が先程のthrow
の例のように、非検査例外(IllegalArgumentException
、NullPointerExceptiont
等)であれば、throws
は記述しなくても良いのですが、 検査例外(IOException
、SQLException
等)であればthrows
を宣言する必要があります。
2-2. 使い方
メソッド名() throws 例外クラス名{}
(複数例外を宣言する場合は、メソッド名() throws 例外クラス名 , 例外クラス名{})
2-3. 使用例
public class Sample {
public void hello(String name) throws Exception {
if ("".equals(name)) {
throw new Exception();
}
if (name == null) {
throw new IllegalArgumentException();
}
System.out.println(name + "さん、こんにちは!");
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
try {
s.hello("");
} catch (IllegalArgumentException e){
System.out.println("名前が空です!");
} catch (Exception e) {
System.out.println("名前を入力して下さい!");
}
}
}
実行結果
名前を入力してください!
先程のSampleクラス
に「もしname
の値が""だった場合、throw
を用いてException
という例外を発生させる」という記述を追加しています。
Exception
は検査例外であるため、helloメソッド
にthrows
を宣言し、更にMainクラス
内でcatch
文に例外をスロー(投げる)しなければいけません。しないとコンパイルエラーが起こります。
ちなみに、この場合IllegalArgumentException
は非検査例外なのでthrows
で宣言していません。
public class Sample {
public void hello(String name) throws Exception, IllegalArgumentException{}
もちろんこのような形で、非検査例外をthrows
で宣言することもできます。
参考資料
↓ こちらの方の動画を非常に参考にさせていただきました
↓ Exception公式ドキュメント
↓ 検査例外と非検査例外に関する記事