【问题标题】:How can Java programs crash when exceptions must always be caught? [duplicate]当必须始终捕获异常时,Java 程序如何崩溃? [复制]
【发布时间】:2015-06-01 02:16:25
【问题描述】:

如果这是一个愚蠢的问题,请原谅我,但据我所知,所有 Java 异常都必须被捕获和处理。 例如,这样的事情会产生编译器错误:

public String foo(Object o) {
    if (o instanceof Boolean) {
        throw new Exception();
    }
    return o.toString();
}

因为foo() 方法没有添加throws 子句。
但是,此示例可以工作(除非方法 foo() 没有 throws 子句或方法 bar() 没有在 foo() 块中使用 foo()):

public String foo(Object o) throws Exception {
    if (o instanceof Boolean) {
        throw new Exception();
    }
    return o.toString();
}

public void bar(Object o) {
    try {
        String s = foo(o);
    }
    catch (Exception e) {
        //...
    }
    //...
}

最后,有时 Java 程序有时仍会由于未处理异常而崩溃。

这是怎么发生的?

【问题讨论】:

  • 它们并不总是被捕获和处理。这就是问题所在。
  • 提供您的堆栈跟踪,以便我们查看异常是什么。
  • 还有Throwable 对象不是Exception 对象。因此,您的 catch 块会错过它们。见this question
  • 您的 JVM 本身也可能由于 JNI 代码中的错误或错误而崩溃。

标签: java exception exception-handling


【解决方案1】:

您不必处理所有种异常。

java.lang.RuntimeExceptionjava.lang.Error 继承的异常是所谓的未经检查的异常,它们可以被try-catch 构造捕获,但它们并非必须如此。

正如您在java.lang.Error 的API 文档中看到的,它不继承自java.lang.Exception。由于这个原因,它不会被您的 try-catch 块捕获 - 您只需查找 java.lang.Exception 及其子类。

看看this article in the docs

【讨论】:

    【解决方案2】:

    有些异常可以不检查,这些异常被称为运行时异常。例如,IllegalArumentException 是未经检查的异常,因为它是 java.lang.RuntimeException 的后代。你可以阅读它here

    【讨论】:

      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 2017-08-12
      • 2013-04-06
      • 2010-09-10
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多