2016-10-13 4 views
0

私はJavaをからHeadFirstに読み込んでいます。私は例外処理についての章を読み始めました。私は自分のコンピュータで実行したコードが本にありました。try-catchが正しく機能しない

import javax.sound.midi.*; 
class PlayMusic 
{ 
    public void play() 
    { 
     try{ 
      Sequencer sq = MidiSystem.getSequencer(); 
      System.out.println("We got a sequencer"); 
     } 
     catch(MidiUnavailableException ex) 
     { 
      System.out.println("Bummer!"); 
      ex.printStackTrace(); 
     } 
    } 
    public static void main(String[] args) 
    { 
     PlayMusic pm = new PlayMusic(); 
     pm.play(); 
    } 
} 

try-catchブロックを削除すると、コンパイラはMidiUnavailableExceptionエラーを発生させます。私はその例外をキャッチするためにtry-catchを使いましたが、System.out.println("Bummer");は実行されません。代わりに、tryブロックが実行されます。

ここで何が起こっているか

+0

[このチュートリアル](https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html)を読んだり読んだりすることをお勧めします。 'catch'ブロックはiffだけを実行します。フィッティング「例外」が発生します。例外をキャッチしなかったため、コンパイラは不平を言っていました(コンパイラは実行時に 'Exception'が発生したかどうかを知ることはできません)。 – Turing85

答えて

0

MidiUnavailableExceptionはチェック例外です。したがって、コードをコンパイルするためにcatchブロックを含める必要があります。ただし、プログラムの実行時に例外が実際にスローされるという保証はありません。あなたのケースでは、それはスローされていないので、あなたのtryブロック内のコードは正常に実行され、エラーのための印刷物は決して呼び出されません。

+0

だから、 'getSequencer()'メソッドを使うたびにtry-catchブロック内に囲む必要があります。なぜなら、 'Exception'を発生させるかもしれないからです。 – Arindam

+0

はい、それを囲むメソッドが例外をスローすることを宣言します(この場合は "play"メソッド)。 –

1

あなたはコンパイラエラーを取得するとがMidiUnavailableExceptionを投げることがあり、それは方法を意味します。実行時には例外がスローされ、アクションが成功するとブロックcatchは入力されません。 finallyブロックをお持ちの場合、となります。を入力してください。

関連する問題