ランタイム例外とは何ですか?チェックされた/チェックされていない例外とは何ですか?エラー/例外の違いなぜこれらの多くのタイプですか?代わりに、Javaは単純な設計(すべてのタイプを試して/キャッチするだけ)に従って、プログラムの異常な状態を処理することができますか?
8 に答える
私は新しいJava開発者なので、さまざまな種類の例外を区別して処理するのにもいくつかの困難に直面しています。だから私はこのトピックについて短いメモを書きました、そして私が混乱するときはいつでも私はそれを通り抜けます。これは、Throwable
クラス階層のイメージです。
[ JavaTpointの画像提供]。
ここで覚えておくべき3つの重要なクラスがあります:Throwable
、、。これらのクラスには、「チェックされた例外」と「チェックされていない例外」の2つのタイプに分類できます。Exception
Error
Exception
チェックされた例外:
- これらは、とを除いて拡張するクラス
Throwable
です。RuntimeException
Error
- これらはコンパイル時にチェックされるため、コンパイル時例外とも呼ばれます。つまり、コンパイラはそれらを処理するか
try/catch
、関数シグネチャでthrows
それらを指定し、呼び出し元で処理するように強制します。 - これらはプログラムで回復可能な問題であり、コードの制御外の予期しない状態(データベースのダウン、ファイルI / Oエラー、誤った入力など)によって引き起こされます。
- 例:、、
IOException
などSQLException
。
未チェックの例外:
- 拡張するクラス
RuntimeException
は、チェックされていない例外と呼ばれます。 - チェックされていない例外は、コンパイル時にチェックされるのではなく、実行時にチェックされるため、この名前が付けられています。
- これらはプログラムで回復可能な問題でもありますが、チェックされた例外とは異なり、コードフローまたは構成の障害が原因で発生します。
- 例:
ArithmeticException
、、、NullPointerException
などArrayIndexOutOfBoundsException
。 - それらはプログラミングエラーであるため、適切に/賢明にコーディングすることで回避できます。たとえば、「ゼロ除算」は、
ArithmeticException
を生成します。これは、除数をチェックするだけで回避できます。同様にNullPointerException
、参照を確認するだけで回避できます。if (object != null)
または、より優れた手法を使用することもできます。
エラー:
Error
によって処理されていない回復不能な状況を指しtry/catch
ます。- 例:
OutOfMemoryError
、、、VirtualMachineError
などAssertionError
。
なぜこれらの多くのタイプですか?
Stephen Cの答えに加えて、私が言いたいのは、例外処理はJavaでは比較的コストのかかる操作です。すべての例外的な状況をブロックに入れるべきではありません。try/catch
sを過度に使用すると、try/catch
プログラムのパフォーマンスが低下する可能性があります。
結論として、Exception
sは可能な限りプログラムで処理する必要があります。一方、Error
sは処理できないため、多くの種類の例外が存在する論理的な理由である可能性があります。
Throwableは、すべての例外の最上位にあります。Throwableの下には、エラーと例外があります。例外の下にRuntimeExceptionがあります。
Javaには、チェックされているものとチェックされていないものの2種類の例外があります。チェックされた例外はコンパイラーによって強制されます(throws節でそれらを宣言し、最終的にキャッチする必要があります)。チェックされていない例外は、throws節でキャッチまたは宣言するために強制されません。
(答えの物議を醸す部分)
Throwableは、すべての例外タイプの親が存在するように存在します。Throwableを投げたり、キャッチしたりしないことを宣言しないでください(自分が何をしているのかを本当に本当に知っている場合を除きます)。
エラーは、ランタイム環境の問題を示すために存在します。たとえば、クラスファイルの形式が正しくない、VMのメモリが不足しているなど、プログラムが回復できない可能性があります。自分が何をしているのかを本当に理解していない限り、エラーをキャッチするべきではありません。
ディスクがいっぱいであるためにファイルを作成できないなど、プログラマー以外のすべてのエラーのルートとして例外が存在します(これに対する「例外」についてはRuntimeExceptionを参照してください)。例外をスロー、スロー、またはキャッチしないでください。例外をキャッチする必要がある場合は、自分が何をしているのかを確認してください。
RuntimeExceptionは、配列の終わりを超えたり、nullオブジェクトのメソッドを呼び出したりするなど、すべてのプログラマーエラーを示すために存在します。これらは、例外をスローしないように修正する必要があるものです。これは、プログラマーであるあなたがコードを台無しにしたことを示しています。繰り返しますが、自分が何をしているのかを知らない限り、これらを捕まえるべきではありません。
TofuBeerの答えは、例外クラスの意味を明確に説明しています。
なぜこれらの多くのタイプ?代わりに、Javaは単純な設計(すべてのタイプを試して/キャッチするだけ)に従って、プログラムの異常な状態を処理することができますか?
なんで?必要だから!これらの4つのクラスがないと、幅広いカテゴリで例外を処理することは現実的ではありません。
Error
クラスなしで「すべての致命的なJVMエラー」をどのようにキャッチしますか?Exception
クラスなしで「JVMの致命的なエラーではないすべての例外」をどのようにキャッチしますか?RuntimeException
クラスなしで「すべてのチェックされていない例外」をどのようにキャッチしますか?
- エラー(VMによってスローされ、キャッチまたは処理されるべきではありません)
- VMエラー
- アサーションエラー
- リンケージエラー...など
- ランタイム/例外のチェックを外します(プログラミングエラー、キャッチまたは処理しないでください)
- NullPointerException
- ArrayIndexOutOfBoundException
- IllegalArgumentException...など
- 例外をチェックします(それ以外の場合、アプリケーションはキャッチまたは処理されることが期待されます)
- IOException
- FileNotFoundException
- SQLException...など
この記事では、チェックされた例外とチェックされていない例外を明確かつ簡潔に要約しています。
チェックされた例外:チェックされた例外は、コンパイル時に検出、識別、およびチェックできる例外です。コードブロックがチェックされた例外をスローする場合、メソッドは例外を処理するか、
throws
キーワードを使用して例外を指定する必要があります。例:
public void testDB() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver Loaded"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/selenium","root","root"); System.out.println("Connected to MySQL DB"); }
try-catch{}
スローを使用して例外のリストを指定するか、ブロックを使用する必要があります。throws
以下のプログラムでの使用法を示しました。
未チェックの例外:未チェックの例外は、コンパイル時にチェックされません。
Error
およびRuntimeException
クラスの下のJava例外はチェックされていない例外であり、 throwableの下の他のすべてがチェックされます。
概要:クライアントが例外から回復することが合理的に期待できる場合は、それをチェック済みの例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。
ランタイム例外は、例外をキャッチして宣言することを回避する柔軟性を提供します。
Exceptions are two types in java:
1. **Checked Exception: The exceptions which are checked by compiler.
例:ファイルを使用して操作を実行している場合、コンパイラーは、try-catchブロックまたはthrowsキーワードのいずれかによってIOExceptionを処理するように要求します。
2. Unchecked Exception: The exceptions which are not checked by compiler at run time.
例:オブジェクトを作成せずに操作を実行している場合。この場合、NullPointerExceptionが発生します。