【问题标题】:Java try/catch block not outputting text when exception is caught捕获异常时,Java try/catch 块不输出文本
【发布时间】: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


【解决方案1】:

我会尽量保持简短。

如果有异常,Try/catch 块会处理异常。

但在某些情况下,您必须放置一个 try/catch 块才能使用可能引发异常的类。

所以在你的情况下,如果你把它拿出来,你的代码将无法编译,因为它要求 try/catch 块,这并不意味着总会有异常。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    Sequencer 类可能抛出异常。这就是为什么你必须添加 try catch 块。但它运行良好,因此不会引发异常。

    尝试移除您的设备,然后运行它。然后它可能会抛出异常。

    【讨论】:

    • 如果我没有 try/catch 块,那么我确实会遇到异常。我对 try/catch 块的理解是它用于处理可能抛出的异常,但它的存在不应该与是否抛出异常有任何关系。
    • 您混淆了运行时异常和编译错误。它们不是一回事。
    • @Argyle 编译时错误也不例外。通常只有在运行程序时才会出现异常。
    • @Argyle Sequencer 类可能定义如下:public void sequencer throws MIDIException 这意味着每个使用此对象的人还必须指定 try catch 块。否则它不会运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多