ホームページ >Java >&#&チュートリアル >Java例外処理の詳細な紹介
この記事では、Java 例外処理について詳しく説明します。必要な方は参考にしてください。
Java 例外処理 (例外処理) に関する例といくつかの知識ポイントを見てみましょう。
#下のプログラムを見てください。 PleaseThrow メソッドは Exception のインスタンスを受け入れ、単にそのインスタンスをスローします。次に、このメソッドを呼び出すときに、SQLException のインスタンスを渡しました。 PleaseThrow の呼び出しは try catch ブロックでラップされているため、質問: PleaseThrow メソッドによってスローされた SQLException は正常にキャッチできますか?
public class ExceptionForQuiz<t> { private void pleaseThrow(final Exception t) throws T { throw (T) t; } public static void main(final String[] args) { try { new ExceptionForQuiz<runtimeexception>().pleaseThrow(new SQLException()); } catch( final SQLException ex){ System.out.println("Jerry print"); ex.printStackTrace(); } } }</runtimeexception></t>
回答: 上記のコードには文法上のエラーがあるため、コンパイルできません。 段階的に分析してみましょう。 Java クラス ExceptionForQuiz
著者のフランク・イエリンは素晴らしい人に違いありません。
ジェネリックは Java 1.5 で導入された概念であるため、ジェネリックには型消去の概念、つまり
generics があります。コードのコンパイル段階でのみ存在し、コンパイルされたコードでは、ジェネリックスに関連する情報は消去されます。 たとえば、前のジェネリック クラスの型パラメーター部分に上限が指定されていない場合、このように
#次は、ExceptionForQuiz.class から逆コンパイルした後のコードです:
上の図から、メソッドpleaseThrowおよびRayExceptionForQuizの汎用パラメータRuntimeExceptionが消去されていることがわかります。 PleaseThrowメソッドでスローできる例外の種類は消去され、Exceptionとなります。
javap を使用して、コンパイルによって生成されたバイトコードを観察すると、型パラメーター RuntimeException が消去されたという事実もわかります:
2 番目の赤で強調表示された領域を見てください: 例外: throw java .lang.Exception
次に、コンパイラがどのようなエラー メッセージを報告するかを見てみましょう: SQLException のキャッチ ブロックに到達できません この例外は try からスローされることはありません。ステートメント本体 .
PleaseThrow メソッドの宣言ではスローのみが可能になったため、例外タイプが消去されたという事実に基づくと、このエラー メッセージは妥当です。このため、14 行目の catch は SQLException 型の例外を受け取ることができないため、コンパイラはエラーをスローします。
このコンパイラ エラーを解決するにはどうすればよいですか? 14 行目の SQLException を RuntimeException に変更するだけです。
ただし、この場合、構文エラーは解消されますが、pleaseThrow メソッドによってスローされた SQLException をキャッチできず、実行時エラーが報告されます。
catch ステートメントを使用して、pleaseThrow によってスローされた SQLException をキャッチするにはどうすればよいですか? 14 行目の RuntimeException をすべての例外のスーパークラス Exception に変更します。 もう一度実行します。今回は構文エラーも実行時エラーもありません。SQLException は 14 行目の catch ステートメントによって正常にキャッチされました。
以上がJava例外処理の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。