English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、例を用いてthrowとthrowsキーワードを使った例外処理を学びます。
Javaでは、例外は二つのタイプに分けることができます:
チェックされない例外:それらはコンパイル時ではなく、ランタイムでチェックされます。例えば:ArithmeticException、NullPointerException、ArrayIndexOutOfBoundsException、Errorクラスの例外など。
チェックする例外:コンパイル時にチェックしてください。例えばIOException、InterruptedExceptionなど。
参照してくださいJavaの例外既知と未検査の例外について詳しく説明します。
通常、未検査の例外を処理する必要はありません。なぜなら、未検査の例外はプログラミングエラーが原因で発生するため、それらを修正することの方が良い習慣です。
今からthrowとthrowsを使って既知の例外を処理する方法に焦点を当てます。
メソッドの宣言にthrowsキーワードを使ってその中で発生する可能性のある例外のタイプを宣言します。
その文法は:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 … { // code }
上記の文法から、複数の例外を宣言するためにthrowsを使うことができます。
import java.io.*; class Main { public static void findFile() throws IOException { //IOExceptionが発生する可能性のあるコード File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); } public static void main(String[] args) { try{ findFile(); } catch(IOException e){ System.out.println(e); } } }
出力結果
java.io.FileNotFoundException: test.txt (ファイルまたはディレクトリが見つかりません)
このプログラムを実行すると、test.txtファイルが存在しない場合、FileInputStreamはIOExceptionを継承するFileNotFoundExceptionをスローします。
メソッドが例外を処理しない場合、そのメソッドで発生する可能性のある例外のタイプをthrows子句で指定する必要があります。これにより、呼び出しスタックの上位のメソッドがそれらを処理したり、throwsキーワード自体で指定することができます。
findFile()メソッドはIOExceptionをスローできることを指定しています。main()メソッドはこのメソッドを呼び出し、スローされる例外を処理します。
これはthrowsキーワードを使って複数の例外を発生させる方法がどのように使われるかを説明します。
import java.io.*; class Main { public static void findFile() throws NullPointerException, IOException, InvalidClassException { // NullPointerExceptionが発生する可能性のあるコード … … … // IOExceptionが発生する可能性のあるコード … … … // InvalidClassExceptionが発生する可能性のあるコード … … … } public static void main(String[] args) { try{ findFile(); }1{ System.out.println(e1.getMessage()); }2{ System.out.println(e2.getMessage()); } } }
ここでは、findFile()メソッドは、throws子句でNullPointerException、IOException、InvalidClassExceptionをスローできることを指定しています。
NullPointerExceptionはまだ処理していないことに注意してください。これはチェックされていないエクセプションです。throws子句で指定して処理する必要はありません。
エクセプションを引き起こす方法がいくつかある場合があります。各メソッドに対してtry...catchを書くのは退屈で、コードが長くて理解しにくくなります。
現在のメソッドでキャッチする予定のないエクセプション(処理する必要があるエクセプション)をチェックした場合、throwsも非常に有用です。
throwキーワードは、エクセプションを明示的にスローするために使用されます。
エクセプションが発生した場合、プログラムの実行フローはtryブロックからcatchブロックに移行します。方法でthrowキーワードを使用します。
その文法は:
throw throwableObject;
ThrowableオブジェクトはThrowableクラスまたはそのサブクラスのインスタンスです。
class Main { public static void divideByZero() { throw new ArithmeticException("0で割ろうとしています"); } public static void main(String[] args) { divideByZero(); } }
出力結果
thread "main"でのException java.lang.ArithmeticException: 0で割ろうとしています at Main.divideByZero(Main.java:3) at Main.main(Main.java:7) exit status 1
この例では、明示的にArithmeticExceptionをスローしています。
注意: ArithmeticExceptionはチェックされていないエクセプションです。チェックされていないエクセプションは通常処理する必要はありません。
import java.io.*; class Main { public static void findFile() throws IOException { throw new IOException("ファイルが見つかりません"); } public static void main(String[] args) { try { findFile(); System.out.println("try ブロック内の残りのコード"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
出力結果
ファイルが見つかりません
findFile() メソッドは、コンストラクタに渡されたメッセージを使用して IOException を投げます。
チェック例外であるため、throws 子句で指定する必要があります。
findFile() メソッドを呼び出すメソッドは、この例外を処理する必要がありますか、または自分で throws キーワードを使用して指定します。
既に main() メソッド内でこの例外を処理しています。例外が発生した場合、プログラムの実行フローは try ブロック間に移行され、catch ブロックの文を実行します。したがって、try ブロック内の残りのコードはスキップされ、catch ブロックの文が実行されます。