Javaでは、チェックされていない例外がtryブロックでキャッチされる可能性があると言われましたが、キャッチされた場合、それはチェックされた例外と呼ばれませんか?
3 に答える
チェックされていない例外は、try
-catch
ブロックでキャッチする必要のない例外です。チェックされていない例外は、RuntimeException
またはError
クラスのサブクラスです。
try
チェックされた例外は、 -catch
ブロックでキャッチする必要がある例外です。
チェックされた例外とチェックされていない例外の定義は、セクション11.2:Java言語仕様の例外のコンパイル時チェックにあります。
チェックされていない例外クラスは、クラス
RuntimeException
とそのサブクラス、およびクラスError
とそのサブクラスです。他のすべての例外クラスは、チェックされた例外クラスです。
チェックされていない例外がcatch
ブロックでキャッチされたからといって、それがチェックされた例外になるわけではありません。つまり、チェックされていない例外がキャッチされ、catch
ブロックで処理されたことを意味します。
catch
チェックされていない例外が発生し、次に新しいチェックされた例外が発生する可能throw
性があるため、チェックされていない例外が発生する可能性があるそのメソッドを呼び出すメソッドは、それを呼び出すメソッドに何らかの例外を処理させます。
たとえば、メソッドに対してNumberFormatException
解析できないものを処理するときにスローされる可能性があるaは、チェックされていない例外であるため、キャッチする必要はありません。ただし、そのメソッドを呼び出すメソッドは、呼び出し元にそのような問題を適切に処理させたい場合があるため、チェックされる別の例外をスローする可能性があります(。のサブクラスではありません)。String
Integer.parseInt
RuntimeException
public int getIntegerFromInput(String s) throws BadInputException {
int i = 0;
try {
i = Integer.parseInt(s);
catch (NumberFormatException e) {
throw new BadInputException();
}
return i;
}
上記の例では、aが-ブロックでNumberFormatException
キャッチされ、 new (チェックされた例外となることを目的としています)がスローされます。try
catch
BadInputException
メソッドの呼び出し元は、getIntegerFromInput
をキャッチするように強制されBadInputException
、不正な入力を処理するように強制されます。NumberFormatException
がキャッチされて処理されない場合、このメソッドの呼び出し元は例外を正しく処理する必要があります。
(また、例外を食べて、実際には意味のないことを行うことは、良い習慣とは見なされないことに注意してください。意味のある例外処理を実行できる場合は、例外を処理してください。)
Javaチュートリアルから:
- レッスン:例外
- キャッチまたは指定要件-チェックされた例外について説明します。
- 連鎖例外-上記の例のように、例外をキャッチして新しい例外をスローする方法。
- 未チェックの例外—論争
いいえ、キャッチされたという理由だけでチェック例外とは呼ばれません。あらゆる種類の例外またはエラーをキャッチするために、catchブロックを作成できます。チェックされた例外は、 CatchまたはSpecify Requirementの対象となる例外です。つまり、それらをキャッチするか、メソッドがそれらをスローする可能性があることを宣言する必要があります。チェックされたという用語は、コンパイラーがキャッチまたは指定要件に準拠していることを確認するためにチェックすることを意味すると考えることができます。エラーとRuntimeExceptionsは、コンパイラーがこの要件を強制しないため、未チェックの例外と呼ばれます。
違いは、コンパイラがキャッチされていないチェック例外と、チェック例外をスローするメソッドにフラグを立てるが、コンパイル時にメソッドシグネチャでそれらを宣言しないことだと思います。
チェックされていない例外は、宣言やキャッチを必要としませんが、どちらも禁止されていません。コンパイラはそれらをエラーとして識別しません。