はじめに
今回の記事は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公式ドキュメント
↓ 検査例外と非検査例外に関する記事