【发布时间】:2016-04-09 23:11:49
【问题描述】:
我一直在阅读 Head First Java 2E 这本书,它涵盖了 Java 5,但我遇到了一个我不理解的异常处理问题。在异常处理章节中,本书给出了以下示例,作为使用 try/catch 块捕获 MidiUnavailableException 的正确方法。
import javax.sound.midi.*;
public class MusicTest {
public void play() {
try {
Sequencer sequencer = MidiSystem.getSequencer();
System.out.println("Sequencer initialized...");
} catch (MidiUnavailableException ex) {
System.out.println("Bummer...");
}
}
public static void main(String[] args) {
MusicTest mt = new MusicTest();
mt.play();
}
}
如果没有 try/catch 块,程序将无法编译并出现 MidiUnavailableException。我希望使用上面的代码,我会得到输出:
Bummer...
相反,我得到了
Sequencer initialized...
这只是 Java 5 和 Java 8 之间的区别还是我做错了什么?
【问题讨论】:
-
为什么会这样?为什么你希望你的程序抛出异常?
-
当你得到“Sequencer initialized...”这意味着没有抛出异常... System.out.println("Sequencer initialized...");被执行。
-
我明白这一点,但如果我把 try 块去掉,我就会得到一个异常。也许我不完全理解异常是如何工作的,但是为什么 try/catch 块会对是否抛出异常有任何影响呢?扔出去不应该抓到一只吗?
-
不,如果你删除了
catch,你没有例外。你有一个编译错误。这是非常不同的:异常是在运行时,当程序运行时。编译器错误在此之前,它是在您编译程序时,在运行它之前。
标签: java exception-handling java-8