web-dev-qa-db-ja.com

Java未チェックの例外は、try / catchブロックを使用して処理できませんか?

チュートリアルで私は未チェックの例外をコードで処理できないことを発見しました(つまり、try/catchブロックを使用できません。例は次のとおりです) ArrayIndexOutOfBoundsException, NullPointerException.のような例外ですが、これらの例外はtry/catchブロックを使用して処理できます。コンセプトがよくわかりません!!

また、スローキーワードはtry/catchブロックでのみ使用できます。スローキーワードはUncheckedExceptionで使用できますか?

21
Aravindh an

チェックされた例外とチェックされていない例外の唯一の違いは、チェックされたものhavethrowsを使用してメソッドシグネチャでキャッチまたは宣言されることですが、チェックされていない例外ではこれはオプションです。

チェックされていない例外はコードで処理できません。つまり、try/catchブロックを使用できません

もちろんできますが、そうする必要はありません。

また、throwキーワードはtry/catchブロックでのみ使用できると思います.throwキーワードはUnchecked Exceptionで使用できますか?

twoキーワードがあることに注意してください。

  • throwは、作成した例外オブジェクトを明示的にスローします。 throw new NullPointerException();は完全に正常に機能しますが、その特定の例外を明示的に作成することは一般的ではなく、ほとんどの人はそれを悪いスタイルと見なします。
  • throwsは、メソッドがその例外をスローする可能性があることを宣言します。チェックされていない例外では、これはオプションですが、事実を文書化するのに役立ちます(ここでも、通常はthrows NullPointerExceptionそれはかなり当たり前だからです。
36

チェックされていない例外はすべて、チェックされている例外と同じように処理できます。必要に応じて、メソッドthrowsを宣言することで、例外を通過させることができます。

public void m() throws RuntimeException {}

または、それらをcatchすることができます。

public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}

RuntimeExceptionクラスがであるのと同じように、クラスExceptionはチェックされていない例外のキャッチオールとして機能します(すべてのチェックされていない例外がそこから拡張されるため)。チェックされた例外のキャッチオール。

前に述べたように、唯一の真の違いは、チェックされた例外についてhaveを処理して(それらを渡したりキャッチしたりして)、コンパイラがそれを確認することです-一方、未チェックの例外の処理はオプションです。

それはすべて、各例外タイプの予想される使用法に要約されます-チェックされていない例外の場合、合理的なことはないかもしれませんが、チェックされた例外から回復することができるはずですそれらから回復する方法。もちろん、これは少し主観的です。

6
Óscar López

それらは処理できますが処理されますが処理する必要はありません。それらを処理しない場合、それらのいずれかがキャッチするまで、それらは伝播し、呼び出しメソッドスタックを上ります。ない場合、プログラムはクラッシュします。

通常、一番下の行は、クライアントが例外から回復することが合理的に期待できる場合、それはチェックされた例外であることです。クライアントが例外から回復するために何もできない場合は、それを未チェックの例外としてもかまいません。

また、checked exceptionsは、サードパーティが使用する予定のAPIを文書化するのに役立ちます。彼らがあなたのメソッドが特定の例外を投げることができることを知っているとき、彼らはそれに応じてコード化してケースを処理します。 未チェックの例外のみを使用する場合、すべての賭けはオフになります。

一般的なパターン(一部の人はそれを気に入らないが、何をしているのかわかっている場合は問題ない)は、スローされたチェック済み例外をチェックされていない例外にラップすることです。

try {
   ... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
    throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}
5
Guillaume

ギヨームに加えて:

  • 未チェックの例外は通常プログラミングエラーであり、正しく実装されていればまったく発生しないはずです(範囲外のインデックス、nullポインター、クラスキャストなど)。したがって、通常、呼び出し元/ユーザーはそれらについて何もできません。
  • チェックされた例外は、プログラマーの制御外にあったためにスローされます(ネットワークが利用できない、ファイルシステムが利用できない、重複した主キーなどの同時変更など)
  • エラーは通常JVMによってスローされ、アプリケーションは通常停止する必要があります(メモリ不足、スタックオーバーフローなど)。
3
Puce

違いを考える簡単な方法は、チェックがコンパイルを指すと考えることです。例外がチェック例外である場合、コンパイラーは、コードが例外をスローするか、コンパイル時にtry/catchブロックで処理するかをチェックします。チェックされていない例外の場合、コンパイラーはそのようなチェックを行いません。同じように(try/catch/throwsを使用して)チェック済み/未チェックの例外を処理できます。違いは、コンパイラが実行するチェックにあります。この投稿にはまともな があります。

3
Chris

はい、チェックされていない例外を処理できますが、必須ではありません。実際には、アプリケーション開発者に依存します。以下は、チェックされていない例外でも処理する必要があると考えられる理由です。

  • アプリケーションが大きく、多くの開発者が互いにAPIを呼び出している場合。未チェックの例外を処理することをお勧めします。そうしないと、最後にプログラムがクラッシュして他の機能が停止します。したがって、単純なNullPointerExceptionでもプログラムの動作を停止させる可能性があります。

  • ユーザーデータを処理し、100万のサイズのスケジューラが1つあり、不良データについては、ログを印刷して他の正常なデータの処理を停止しないようにしたいとします。その場合、例外を処理しないと、1つの不良データがプログラムを停止する可能性があります

0
CrazyCoder

はい、throwを使用して未チェックの例外をスローできます。そして、はい、未チェックの例外をcatchブロックでキャッチできます。

0
tobiasbayer