Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで到達不能なキャッチブロックとは何ですか?


コントロールが到達できないステートメントのブロック いずれの場合も、到達不能ブロックと呼ぶことができます 。到達不能ブロックはJavaではサポートされていません。 例外クラスの参照で言及されているcatchブロックは、常に最後である必要があり、最後である必要があります 例外のためにブロックをキャッチします スーパークラスです すべての例外の。複数のキャッチブロックを保持している場合、キャッチブロックの順序は最も具体的なものから最も一般的なものまでである必要があります 。つまり、Exceptionのサブクラスが最初に来て、スーパークラスが後で来なければなりません。最初にスーパークラスを保持し、後でサブクラスを保持すると、コンパイラは到達不能なキャッチブロックエラーをスローします

構文

try {
   // statements
} catch(Exception e) {
   System.out.println(e);
} catch(NumberFormatException nfe) { //unreachable block. Not supported by Java, leads to an error.
   System.out.println(nfe);
}

次の条件の両方が当てはまる場合、catch句はコンパイラによって到達可能であると見なされます

  • tryブロックでスローされるチェック済みの例外は、Cのパラメーターに割り当てることができます。
  • パラメータタイプがCのパラメータタイプと等しいかスーパータイプである以前のcatch句はありません

次の条件の両方が当てはまる場合、catch句はコンパイラによって到達可能であると見なされ、到達不能になる可能性があります

  • catch句のパラメータタイプEには、チェックされていない例外は含まれていません。
  • タイプがEの(厳密な)サブタイプであるtryブロックでスローされるすべての例外は、以前のcatch句によってすでに処理されています。

public class UnreachableBlock{
   public static void main(String[] args) {
      try {
         int i = Integer.parseInt("abc"); //This statement throws NumberFormatException
      } catch(NumberFormatException nfe) {
         System.out.println("This block handles NumberFormatException");
      } catch(Exception e) {
         System.out.println("This block handles all exception types");
      } catch (Throwable t) {
         System.out.println("Throwable is super class of Exception");
      }
   }
}

出力

This block handles NumberFormatException

  1. Javaで複数のcatchブロックを持つtryブロックを定義できますか?

    はい、Javaで複数のcatchブロックを含む1つのtryブロックを定義できます。 すべての試行は、少なくとも1つのキャッチブロックに関連付ける必要があり、関連付ける必要があります。 tryブロックで例外オブジェクトが識別され、複数のcatchブロックがある場合は常に、catchブロックが定義された順序に基づいてcatchブロックの優先順位が与えられます。 常に最初のキャッチブロックが最優先されます。最初のcatchブロックが識別された例外オブジェクトを処理できない場合、すぐ次のcatchブロックが考慮されます。 例 class TryWithMultipleCatch {  

  2. Javaでcatchブロックなしのtryブロックを使用できますか?

    はい、finalブロックを使用することで、catchブロックなしでtryブロックを作成できます。 ご存知のとおり、tryブロックで例外が発生した場合でも、System.exit()が常に実行されることを除いて、finalブロックは常に実行されます。 例1 public class TryBlockWithoutCatch {    public static void main(String[] args) {       try {          System.out.println(&q