ホームページ  >  記事  >  Java  >  Java例外処理の詳細な紹介

Java例外処理の詳細な紹介

不言
不言転載
2018-10-24 10:59:541802ブラウズ

この記事では、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例外処理の詳細な紹介

回答: 上記のコードには文法上のエラーがあるため、コンパイルできません。

段階的に分析してみましょう。

Java クラス ExceptionForQuiz は汎用構文を使用します。T extends Exception は、この汎用クラスがインスタンス化されるときに、渡される型パラメーター T が Exception とそのサブクラスである必要があることを意味します。

クラス ExceptionForQuiz をインスタンス化すると、渡される型パラメーターは RuntimeException です。

RuntimeException は Java の未チェック例外です。メソッドの実行中に RuntimeException がスローされる場合でも、開発者はメソッドの前にコードで明示的に宣言する必要はありません。

JDK RuntimeException のコメントを見ると、それは非常に明らかです。チェックされていない例外は、メソッドまたはコンストラクターの実行によってスローされる可能性がある場合、メソッドまたはコンストラクターの句で宣言する必要はありません。

著者のフランク・イエリンは素晴らしい人に違いありません。

Java例外処理の詳細な紹介

ジェネリックは Java 1.5 で導入された概念であるため、ジェネリックには型消去の概念、つまり

generics があります。コードのコンパイル段階でのみ存在し、コンパイルされたコードでは、ジェネリックスに関連する情報は消去されます。 たとえば、前のジェネリック クラスの型パラメーター部分に上限が指定されていない場合、このように のように記述すると、通常の Object 型に変換されます。 などの上限が指定されている場合、型パラメータは型の上限に置き換えられます。

わかりやすくするために、まずコード内の try catch ブロックを削除します。

Java例外処理の詳細な紹介#次は、ExceptionForQuiz.class から逆コンパイルした後のコードです:

Java例外処理の詳細な紹介上の図から、メソッドpleaseThrowおよびRayExceptionForQuizの汎用パラメータRuntimeExceptionが消去されていることがわかります。 PleaseThrowメソッドでスローできる例外の種類は消去され、Exceptionとなります。

javap を使用して、コンパイルによって生成されたバイトコードを観察すると、型パラメーター RuntimeException が消去されたという事実もわかります:

2 番目の赤で強調表示された領域を見てください: 例外: throw java .lang.Exception

Java例外処理の詳細な紹介次に、コンパイラがどのようなエラー メッセージを報告するかを見てみましょう: SQLException のキャッチ ブロックに到達できません この例外は try からスローされることはありません。ステートメント本体 .

Java例外処理の詳細な紹介PleaseThrow メソッドの宣言ではスローのみが可能になったため、例外タイプが消去されたという事実に基づくと、このエラー メッセージは妥当です。このため、14 行目の catch は SQLException 型の例外を受け取ることができないため、コンパイラはエラーをスローします。

このコンパイラ エラーを解決するにはどうすればよいですか? 14 行目の SQLException を RuntimeException に変更するだけです。

ただし、この場合、構文エラーは解消されますが、pleaseThrow メソッドによってスローされた SQLException をキャッチできず、実行時エラーが報告されます。

Java例外処理の詳細な紹介

catch ステートメントを使用して、pleaseThrow によってスローされた SQLException をキャッチするにはどうすればよいですか? 14 行目の RuntimeException をすべての例外のスーパークラス Exception に変更します。

もう一度実行します。今回は構文エラーも実行時エラーもありません。SQLException は 14 行目の catch ステートメントによって正常にキャッチされました。

Java例外処理の詳細な紹介

以上がJava例外処理の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。