2016-10-13 2 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. добавляется «Исключение». Компилятор действительно жаловался, потому что вы вообще не заметили исключение (компилятор не может знать, возникает ли «Исключение» во время выполнения). – Turing85

ответ

0

MidiUnavailableException - исключенное исключение, поэтому для компиляции кода необходимо включить блок catch. Тем не менее, нет никакой гарантии, что исключение действительно будет запущено, когда ваша программа будет выполнена. В вашем случае это не бросается, поэтому код в вашем блоке try выполняется нормально, и ваша распечатка для ошибки никогда не вызывается.

+0

Итак, вы имеете в виду, что всякий раз, когда я буду использовать метод 'getSequencer()', мне нужно заключить его в блок try-catch, потому что это может вызвать «Исключение». – Arindam

+0

Да, либо это, либо объявить, что метод включения генерирует исключение (в данном случае метод «play»). –

1

Когда вы получите ошибку компилятора, это означает, что метод может бросить MidiUnavailableException. Во время выполнения, когда выбрасываются исключения, и если действие завершается успешно, то блок catch не будет введен. Если у вас есть блок finally, то являетсягарантировано для ввода.

Смежные вопросы