2017-04-11 6 views
-1

免責事項:私はJavaコンパイラにアクセスすることはできません。また、IDEをインストールすることもできません。私のワークスペースは十分な特権を与えません。それが投げされ、サブクラスが明示的にすべての例外をキャッチするcatchブロック内で例外をスローする場合明示的にスローされた例外が上向きにスローされますか?

私は、Javaの例外を扱う方法を理解しようとしていると、この質問につまずきましたか?だから、新しい例外がtryブロックの中で投げられ

public Class someClass { 
    public int value; 
    public someClass() { 
     value = 1; 
     try { 
      value ++; 
      if(value == 2) { 
       throw new Exception("value is 2"); 
      } 
     } catch (exception e) { 
      System.out.println("I caught an exception."); 
      throw new Exception("Does this exception get thrown upwards?"); 
      System.out.println("will this line of code get printed after the previously thrown exception?"); 
     } finally { 
      return; 
     } 
    } 
} 

public class anotherClass { 
    public static void main throws Exception{ 
     someClass someclass = new someClass(); // will this class catch the second explicitly thrown exception? 
    } 
} 

、以下のcatchブロックでキャッチ:たとえば、次のコード行を検討してください。 2番目のスローステートメントはどこに行きますか?もしそれがあれば、それは上級クラスに入りますか?また、printlnステートメントはfinallyブロックにないのに例外がスローされた後に実行されますか?

ありがとうございました。

+3

あなたは既にコードを持っています。なぜそれを実行し、何が起こるかを見てみませんか? –

+0

はい、2番目のバブルは泡立ち、投げた後の 'println'文は実行されません。よいIDEは2番目の 'println'を到達不能コードとして表示します。 EclipseとFindBugsプラグインを試してみてください。 –

+0

@ThomasWeller現在の仕事用コンピュータにはJavaがなく、Javaをインストールする権限がありません。また、管理者に連絡することもできません。 – noobcoder

答えて

1

2番目のthrow文はどこにありますか?それがある場合は、 呼び出しクラスに上向きに移動しますか?

はい、例外は呼び出し元メソッドにスローされます。あなたの場合は、main()メソッドです。

例外がスローされ 後のprintln文は、finallyブロックではないにもかかわらず、実行得るのだろうか?

はい、System.out.println("I caught an exception.")が実行され、その後、例外オブジェクトは、発信者(すなわち、main())にスローされますので、あなたのcatchブロックで、次の行が到達不能です。

System.out.println("will this line of code get 
       printed after the previously thrown exception?"); 

重要な点は、常に例外は、メソッドのスタック全体に伝播されたかをチェックするために(catchブロック内)exception.printStackTrace()を使用することができるということです。私はこれを試すことをお勧めしますので、メソッド間でどのように例外が伝播しているかがはっきり分かります。

hereを参照し、メソッド連鎖の実行方法を明確に理解することをお勧めします。

また、あなたが興味があるかもしれない他のポイントはmain()メソッドが例外をスローした場合(つまり、どちらかmain()自体やチェーンを通しては、ケースも何でも)、その後、JVMが例外をキャッチし、シャットダウンするということです

+0

洞察をいただきありがとうございます! – noobcoder

1

おそらく意図したものではないが、例外はあなたもsomeClassのコンストラクタで行方不明throws句で見ることができ、特定の場合に投げられないます。

finallyブロックのreturnステートメントが原因で、Javaが例外を破棄してしまいます(そして、良いIDEが「最終ブロックは正常に完了しません」という警告が表示される)。catchブロックは、理由Rによって中途完了すれば、finally ブロックが実行される

具体的には、section 14.20.2 of the specificationは、と述べています。

  • finallyブロックが正常に完了すれば、try文は理由で中途完了するR.

  • finallyブロックが理由Sによって中途完了すれば、try文が完了します。その後、選択があります理由Sのために急に(そして理由Rは捨てられる)。 理由Sreturnの文と理由Rthrow new Exception("Does this exception get thrown upwards?");であることで

あなたはon ideone.comを自分で見ることができます:

class someClass { 
    public int value; 

    public someClass() { 
     value = 1; 
     try { 
      value++; 
      if (value == 2) { 
       throw new Exception("value is 2"); 
      } 
     } catch (Exception e) { 
      System.out.println("I caught an exception."); 
      throw new Exception("Does this exception get thrown upwards?"); 
     } finally { 
      return; 
     } 
    } 
} 

class anotherClass { 
    public static void main(String[] args) { 
     try { 
      someClass someclass = new someClass(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

出力:

I caught an exception. 

しかし、この質問の目的のために、javaguyの答えは、すでに十分に一般的なポイントをカバーしています。

関連する問題