2016-10-13 5 views
0

에서 HeadFirst으로 Java를 읽습니다. 예외 처리에 대한 장을 읽기 시작했습니다. 책에 컴퓨터에서 실행 한 코드가 있습니다.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

[this tutorial] (https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html)을 계속 읽거나 읽어야합니다. 'catch' 블록은 iff 만 실행합니다. 피팅 '예외'가 발생합니다. 컴파일러는 예외를 전혀 잡지 않았기 때문에 불평을했습니다 (컴파일러는 실행시에 'Exception'이 발생하는지 알 수 없습니다). – Turing85

답변

0

MidiUnavailableException은 검사 된 예외이므로 코드를 컴파일하려면 catch 블록을 포함해야합니다. 그러나 프로그램이 실행될 때 예외가 실제로 throw 될 것이라는 보장은 없습니다. 귀하의 경우, 그것은 던져되지 않습니다, 그래서 귀하의 try 블록의 코드가 정상적으로 실행되고 오류에 대한 귀하의 인쇄물이 절대로 호출되지 않습니다.

+0

그래서'getSequencer()'메소드를 사용할 때마다 try-catch 블록 내에 넣어야합니다. 왜냐하면'Exception'을 발생시킬 수 있기 때문입니다. – Arindam

+0

예, 그 중 하나 또는 포함하는 메서드가 예외 (이 경우 "재생"메서드)를 throw하는 선언하십시오. –

1

, 그것은 방법 수도MidiUnavailableException를 던질 것을 의미한다. 런타임에 예외가 발생하면 액션이 성공하면 catch 블록이 입력되지 않습니다. finally 블록이있는 경우 이며,을 보장합니다.