如果抛出RuntimeException,它是否可以作为异常捕获?

时间:2012-10-18 09:21:45

标签: java exception

如果我有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?
}

我的想法是,因为RuntimeException扩展了Exception。但是我有一些不符合这种方式的生产代码。很明显,如果答案是否定的,那就是我的答案;否则我需要深入了解为什么我的代码坏了。提前谢谢!

7 个答案:

答案 0 :(得分:9)

RuntimeException派生自Exception,因此会被抓住。

说完这个,不要这样做!应该防止运行时异常,而不是捕获。

答案 1 :(得分:7)

是。它将捕获RuntimeException但是如果在catch块中出现任何Exception,则必须再次捕获。

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

答案 2 :(得分:4)

如果catch(Exception)没有捕获您的RuntimeException,那么您的应用程序的行为就不像您想象的那样。

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

打印

Caught java.lang.RuntimeException

答案 3 :(得分:3)

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

答案 4 :(得分:3)

是的,你可以捕获RuntimeException ...但我认为它不是一个好方法,如果你抓住它你应该正确管理它。否则结果就在你手中。最好的方法是将它留给JVM。 JVM将处理它。

答案 5 :(得分: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();
    }
}

答案 6 :(得分:-2)

我是IT的项目经理,我和我的开发人员一遍又一遍地争论,他们根本不在乎。浏览网络,甚至大多数人都主张捕捉和投掷RuntimException ......每当我看到它,经历了10年的经验后,我对这次无能为力感到非常愤怒....

规则1:

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

规则2:

只捕获一个Runtimeexception以便真正导入与您的软件无关的内容:例如:发送邮件到操作紧急转移,记录异常,重启服务器....

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

创建新类DevelopmentException扩展异常。 然后goahead并编写代码并最初捕获异常。然后你重新抛出它作为你自己的发展特征。在捕捉它的方法中,你记录它。

现在:每天grep为你个人的DevelopmentException。如果你发现这意味着还有工作要做。进入你的代码,看看Exception来自哪里并事先捕获它。

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

抛出和捕获运行时异常的最大问题是编译忽略它。所以这意味着当你的一个同事写一个预订界面并在缺少一个值时抛出RuntimeException(是的,ppl真的这样做)......编译器不会告诉你可能存在运行时异常。现在,当你没有抓住它时,你的程序可能只是关闭而没有任何记录。

为什么称它为RuntimeException? 许多人在程序运行时错误地将其视为错误,但它实际上意味着“异常具有极大的破坏性,以至于Java Runtime Environment需要停止”。换句话说,它meand:OutOfMemory,BrokenRam,JRE的FaultyImplementation等......基本上告诉你的东西:程序因为PC崩溃而无法运行....

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

PS:关于连续删除堆栈跟踪:

一旦看到异常,请尝试使用例如空指针异常。 当你看到Nullpointerexception转到你的代码并删除堆栈跟踪,只是log.WARN(NullpointerOccured)并写你的程序重试等等...

理想情况下,重复此操作直到您再也看不到Stacktrace。 如果你看不到堆栈跟踪,那就意味着所有可能出错的问题都需要处理(当然,除了RuntimeException)