4

如果我有一个try抛出RuntimException子类的块,后续catch块能否将其捕获为Exception? 具体来说:

public class MyAppException extends RuntimeException {
    // ....
}

// In some other part of the code:
try {
    // Executing this results with doSomething() throwing a MyAppException.
    int x = doSomething();
} catch(Exception exc) {
    // Does the thrown MyAppException get caught here?
}

我的想法是肯定的,因为 a RuntimeExceptionextends Exception。但是我有一些生产代码不是这样的。很明显,如果答案是否定的,那么这就是我的答案;否则我需要深入研究,看看为什么我的代码很糟糕。提前致谢!

4

7 回答 7

11

RuntimeException派生自Exception,所以它会被抓住。

说了这么多,千万别做!应该防止而不是捕获运行时异常。

于 2012-10-18T09:23:29.750 回答
8

是的。它会捕获RuntimeException,但万一Exception出现在 catch 块中,您必须再次捕获。

我建议您进行本地部署并调试代码。

于 2012-10-18T09:22:56.137 回答
5

如果 catch(Exception) 没有捕获您的 RuntimeException,那么您的应用程序的行为方式与您的想法不同。

try {
    throw new RuntimeException();
} catch (Exception e) {
    System.out.println("Caught "+e);
}

印刷

Caught java.lang.RuntimeException
于 2012-10-18T09:24:31.280 回答
3

是的。可以捕获 RuntimeExceptions。Throwable 的所有子类都可以被捕获。

于 2012-10-18T09:25:06.380 回答
3

是的,你可以捕捉 RuntimeException ......但我认为这不是一个好方法,如果你捕捉到它,你应该妥善管理它。否则结果将不在你的掌控之中。最好的方法是将它留给 JVM 。JVM 会处理它。

于 2012-10-18T11:39:11.627 回答
1

是的,你的想法是正确的,我认为最好的方法是知道“只写代码”的答案,让代码告诉你答案。您可以看到以下简单的示例代码:

    package own;

public class MyExceptionTest {

    public void testRuntimeException (){
        throw new MyException();
    }

    public static void main(String[] args) {
        try{
            new MyExceptionTest().testRuntimeException();
        }catch(Exception e){
            System.out.println(e.getClass().getName());
        }
    }
}    

class MyException extends RuntimeException{
    public MyException(){
        super();
    }
}
于 2012-10-18T09:36:20.167 回答
-4

我是 IT 部门的项目经理,我和我的开发人员一遍又一遍地争论,他们根本不在乎。浏览网络,甚至大多数人都主张捕获并抛出 RuntimException ......每次看到它,我都会对 10 年经验后的无能感到难以置信的愤怒......

规则 1:

如果您没有捕获 RuntimeException,则永远不要在 Program 中抛出 runtimeexception。

规则二:

只有捕获一个运行时异常才能真正导入与您的软件无关的东西:例如发送邮件到操作紧急转移、记录异常、重新启动服务器......

这样做的原因是,在好的软件中,日志文件中没有堆栈跟踪。当开始编码感到不舒服时,请执行以下操作:

创建新类 DevelopmentException 扩展异常。然后继续编写代码并最初捕获异常。然后你把它作为你自己的开发例外重新抛出。在捕获它的方法中,您记录它。

现在:每天 grep 为您非常个人的 DevelopmentException。如果你找到了,这意味着还有工作要做。进入您的代码并查看异常来自何处并事先捕获它。

理想情况下,您将再也不会在程序的这一部分中看到 DevelopmentException。重复直到您的软件中剩下 0 个 Stacktraces 并且您已经完善了异常处理。

抛出和捕获运行时异常的最大问题是编译会忽略它。因此,这意味着当您的一位同事编写预订界面并在缺少值时抛出 RuntimeException(是的,ppl 确实如此)... ...编译器不会向您显示可能存在运行时异常。现在,当您没有捕获它时,您的程序可能会在没有任何日志记录的情况下关闭。

为什么叫RuntimeException?许多人将此误认为是程序运行时的错误,但它实际上意味着“一个异常具有完全破坏性,以至于需要停止 Java 运行时环境”。换句话说,它的意思是:OutOfMemory、BrokenRam、JRE 的 FaultyImplementation 等......基本上是告诉你的东西:程序无法运行,因为 PC 正在崩溃......

只是我的2美分。有没有人经历过同样的事情?

PS:关于不断删除堆栈跟踪:

一旦你看到一个异常尝试用例如 NullpointerException 来捕捉它。当您看到 Nullpointerexception 转到您的代码并删除堆栈跟踪时,只需 log.WARN(NullpointerOccured) 并编写您的程序以重试左右......

理想情况下,您会重复,直到您再也看不到 Stacktrace。当您永远看不到堆栈跟踪时,这意味着所有可能出错的问题都已处理(当然除了 RuntimeException)

于 2015-03-19T22:34:57.543 回答