20

例外について読んでいると、チェックされた例外とチェックされていない例外に出くわします。

編集:例外クラスを作成するかどうかを知りたいのですが、チェック済みまたは未チェックとして作成するにはどうすればよいですか?

それぞれの意味は何ですか?

4

6 に答える 6

22

またはThrowableのサブクラスを除くすべてのがチェックされます。正しくは、Java では、「例外」は のサブクラスであり、「エラー」は のサブクラスであり、通常は直接サブクラス化されません。java.lang.RuntimeExceptionjava.lang.Errorjava.lang.Exceptionjava.lang.Errorjava.lang.Throwable

プログラムは独自のErrorサブクラスを作成することは想定されていません (ただし、ドキュメントはそれについてかなり曖昧です)。そのため、通常、チェックしたくない場合は常にExceptionsa を使用して を作成します。RuntimeException

チェックされた例外があるかどうかを実行時に知るには、次を使用できます。

if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
    // this is a checked Exception
    }

チェックされた例外は、catch 句で処理するか、メソッド シグネチャでスローされると宣言する必要がある例外です。コンパイラはこれを強制します。一般に、呼び出し元のコードで処理する必要がある例外にはチェック済み例外を使用し、プログラミング エラーの結果であり、コードを修正して修正する必要がある条件には非チェック例外を使用します。

とはいえ、Java コミュニティでは、チェックされた例外とチェックされていない例外をどこでも使用することの有効性について多くの議論があります。

EDIT 2012-10-23:Throwableコメント (非常に有効です) への対応として、明確にするために、capturedが checked Throwableではなく、checked であるかどうかを判断するために必要なものは次のとおりですException

if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
    // this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
    }

問題のオブジェクトが のインスタンスであることがわかっThrowableている場合(たとえば、キャッチされた場合)、上記の「if」の 2 番目の部分のみが必要です (たとえば、Throwable のテストは冗長です)。

于 2010-03-10T17:19:51.860 に答える
5

Java 言語仕様の第 11 章を参照してください。

非チェック例外クラスは、クラスRuntimeException とそのサブクラス、およびクラスErrorとそのサブクラスです。他のすべての例外クラスはチェック例外クラスです。Java API では、チェック済みとチェック解除済みの両方の例外クラスが多数定義されています。プログラマは、追加の例外クラス (チェック済みと未チェックの両方) を宣言できます。

実行時にこれを確認できinstanceofますが、これがどこで役立つかはわかりません。

あなたの質問の2番目の部分について:

  • チェックされた例外は、通常のプログラム実行中に発生する可能性があるため、常にプログラムで処理する必要がある (コンパイラが強制する) 予想されるエラー状態を表します。

  • 未チェックの例外は、予期しないエラー状態を表し、無効な入力、バグ、または実行時の制限 (メモリなど) によるプログラムの異常な状態を示します。コンパイラはプログラマにこれらの処理を強制しません。つまり、それらの発生を知っている場合にのみ処理する必要があります

于 2010-03-10T17:23:44.860 に答える
1

例外クラスがのサブクラスである場合RuntimeException、それはチェックされず、関数に対して宣言したり、キャッチしたりする必要はErrorありません。例外も宣言/キャッチする必要はありません。それはあなたが求めていることですか?

于 2010-03-10T17:18:18.327 に答える
0

これは以前に尋ねられて回答されていることは確かですが、念のため、ここで非常にうまくカバーされています: http://www.javapractices.com/topic/TopicAction.do?Id=129

厳密に言えば、チェックされていない例外は常に拡張されますが、チェックされた例外は拡張さRuntimeExceptionれません。言及されたリンクは、どちらをいつ使用するかを説明しています。

その名前が示すように、呼び出し元はチェック例外を処理する義務があり、通常はそれらを処理 ( try/catch) するか、スタックのさらに上に渡します。非チェック例外は、通常、呼び出し元の制御外の要素によって引き起こされたと見なされます。

于 2010-03-10T17:18:49.157 に答える
-2
package practice;

import java.io.IOException;

class Practice
{
    public static void main(String args[])
    {
        Exception n=new NullPointerException();
        if(n instanceof RuntimeException)
        {
            System.out.println("this is a runtime(unchecked) exception");
        }
        else
        {
            System.out.println("this is not a compiletime(checked) exception");
        }

    }

}
于 2013-09-12T18:22:08.463 に答える