"Throw"の和訳は「投げる」
javaにおいて、
-
throw
は、意図的に例外を発生させたい場合などに使う -
throws
は、メソッドの呼び出した側に例外処理を投げる
参考にしたサイト:
【Java初心者向け】throwとthrowsの違いとその使い方
throw
コード上、入力された値に問題はないが、意図して例外処理を発生させたい場面に使う。
以下は、整数の値である19
を渡しているので問題はないけれど、if文で20未満の値が入力された場合は例外処理を発生させている。
この際の例外クラスは、「メソッドの引数に不正な引数が渡された場合」に例外を発生させるIllegalArgumentException
を使用する。
public class Exception_Test5 {
public static void main(String[] args) {
// 年齢を表す変数age
int age = 19;
// 20未満の整数の場合は例外を発生
if (age < 20) {
throw new IllegalArgumentException ( age + "歳の方には非対応です。");
}
}
}
Exception in thread "main" java.lang.IllegalArgumentException: 19歳の方には非対応です。
ちなみに文字列でもいける。
public class Exception_Test5 {
public static void main(String[] args) {
// 文字列
String words = "ABC";
// ABCという文字列は例外処理
if (words == "ABC") {
throw new IllegalArgumentException ( words + "は非対応な文字列です。");
}
}
}
throws
メソッドの呼び出し元で例外処理を行う
今回の「throws」キーワードをメソッドの定義に追加することにより、例外処理を「そのメソッドの中ではなく、そのメソッドを呼び出した別の箇所」に任せるということが可能になります。
すなわち、「throws」キーワードをつけて定義されたメソッドを呼び出す際には、呼び出す処理を書く部分で例外処理のコードを書かなければならない
tyr-catch文はその場で(メソッド内で)例外処理を行い、
throwsはそのメソッドを呼び出した先で例外処理を行う。
《実践してみる》
下記通り通常通りメソッドを作成する。
下記で指定しているファイルは存在していないのでエラーになるはずです。
しかし、例外処理は含まれていません。
static void method1() {
// Scannerオブジェクトを作成してファイルを読み込むメソッド
Scanner scanner = new Scanner(new File("test.txt"));
//ファイルの読み込みが続く場合、処理を続ける
while (scanner.hasNext()) {
//改行までの入力を受け取る
String input = scanner.nextLine();
System.out.println(input);
}
}
次に、mainメソッドにて、このmethod1
を呼び出して使いたいとします。
その際にはまず、throws 例外処理のクラス名
を以下画像のようにメソッド名の後ろに追記。
そしてmainメソッドではtry-catch文にて、method1をtryし、例外処理をcatchする。
public static void main(String[] args) {
try {
method1();
} catch (FileNotFoundException e) {
//ファイルが見つからない場合に行う処理
System.out.println("ファイルが見つかりません");
}
}