謎の解明: Java の「エラー: 未報告の例外」
謎めいた「エラー: 未報告の例外 ; が必要です」捕まるか、スローされると宣言されますか?心配しないでください。このコンパイル エラーを理解すると、Java の概念がわかりやすくなり、問題の解決に役立ちます。
エラー メッセージの解明:
このエラーは、コードが XXX という名前の例外 をチェックしましたが、その処理に失敗しました
エラーの背後にある概念:
Java は例外を 2 つのタイプに分類します:
- チェック例外: RuntimeException とそのサブクラスを除く、java.lang.Throwable および Exception から派生します。これらの例外は、それを囲んでいるメソッドまたはコンストラクター内で処理する必要があります。
- 未チェック例外: Error とそのサブクラス、および RuntimeException とそのサブクラスで構成される、未チェック例外は明示的に処理する必要はありません。
問題を解決する問題:
エラーに対処するには、次のいずれかの方法でコード内のチェック例外を処理する必要があります。
- 例外のキャッチと処理: 囲みコードサンプルで示されているように、try ...catch ブロック内で例外をトリガーするステートメント以下:
try {
// Code that may throw the checked exception
if (someFlag) {
throw new IOException("cannot read something");
}
// Subsequent code
} catch (IOException ex) {
// Handle the exception gracefully
}
ログイン後にコピー
- 囲んでいるメソッドまたはコンストラクターが例外をスローすることを宣言します: メソッドまたはコンストラクターの宣言に throws XXX 句を追加することで、メソッドまたはコンストラクターの呼び出し元に対する例外を処理する責任。以下に例を示します。
public void doThings() throws IOException {
// Code that may throw an IOException
if (someFlag) {
throw new IOException("cannot read something");
}
// Subsequent code
}
ログイン後にコピー
正しい選択を行う:
正しいアプローチは、コンテキストと、コンテキスト内での例外の望ましい処理によって異なります。コード。重大度のレベルと例外処理時に例外から回復する能力を考慮してください。
特別な考慮事項:
- 静的初期化子: 静的初期化子でのチェック例外の処理には、構文上の制限があるため、慎重な処理が必要です。代わりに静的ブロックの使用を検討してください。
- 静的ブロック: 囲むコンテキストがないため、チェックされた例外は静的ブロック内でキャッチする必要があります。
- ラムダ: Lambda は、使用する関数インターフェイスのため、未チェックの例外をスローできません。ラムダ自体内で例外を処理します。
- 複数の例外: 例外の完全修飾名が同じ名前であっても異なる場合、これらの例外は別個のものになります。これらは個別に処理します。
追加リソース:
- Oracle Java チュートリアル:
- [キャッチまたは指定の要件](https://docs.oracle.com/javase/tutorial/essential/Exceptions/catchExceptions.html#:~:text=キャッチまたは指定の要件)
- [捕獲と取り扱い例外](https://docs.oracle.com/javase/tutorial/essential/Exceptions/handling.html)
- [メソッドによってスローされる例外の指定](https://docs.oracle.com /javase/tutorial/essential/Exceptions/throwing.html)
以上がJava で「エラー: 報告されていない例外 ; スローされるようにキャッチまたは宣言する必要があります」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。