Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果抛出RuntimeException,是否可以将其捕获为异常?_Java_Exception - Fatal编程技术网

Java 如果抛出RuntimeException,是否可以将其捕获为异常?

Java 如果抛出RuntimeException,是否可以将其捕获为异常?,java,exception,Java,Exception,如果我有一个try块抛出一个runtimeexception子类,那么后续的catch块能否将其作为异常捕获?具体而言: public class MyAppException extends RuntimeException { // .... } // In some other part of the code: try { // Executing this results with doSomething() throwing a MyAppException.

如果我有一个
try
块抛出一个
runtimeexception
子类,那么后续的
catch
块能否将其作为
异常捕获?具体而言:

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
。但是,我有一些生产代码不是这样运行的。很明显,如果答案是否定的,那就是我的答案;否则我需要深入研究,看看我的代码为什么会坏掉。提前谢谢

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


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

RuntimeException
源自
Exception
,因此它会被捕获

说了这句话,不要这样做!运行时异常应该被阻止,而不是捕获。

如果捕获(异常)没有捕获您的RuntimeException,则您的应用程序的行为方式与您所想的不同

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

Caught java.lang.RuntimeException

对。可以捕获运行时异常。
所有的Throwable子类都可以被捕获。

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

    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();
    }
}

是的,您可以捕获RuntimeException…但是我认为这不是一个好方法,如果您捕获它,您应该正确地管理它。否则,结果将无法控制。最好的方法是把它留给JVM。JVM将处理它。

我是it领域的项目经理,我与开发人员多次发生同样的争论,他们根本不在乎。浏览网络时,甚至大多数人都主张捕获和抛出RuntimeException。。。每次我看到它,我都会对10年的经验后的不称职感到难以置信的愤怒

第1条规则:

如果未捕获到runtimeexception,则永远不要在程序中抛出runtimeexception。

第2条规则:

只有捕获运行时异常,才能真正导入与您的软件无关的内容:例如,发送邮件给操作紧急值班、记录异常、重新启动服务器

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

创建新类DevelopmentException扩展异常。 然后开始编写代码并捕获异常。然后你把它重新命名为你自己的开发例外。在捕获它的方法中,您记录它

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

理想情况下,您再也不会在程序的这一部分中看到开发异常。重复此操作,直到软件中剩下0个堆栈跟踪,并且您已经完善了异常处理

引发和捕获运行时异常的最大问题是编译忽略它。所以这意味着当你的一个同事编写了一个预订界面,并在缺少值时抛出RuntimeException(是的,ppl真的这么做了)。。。编译器不会向您显示可能存在运行时异常。现在,当您没有捕获到它时,您的程序可能会在没有任何日志记录的情况下关闭

为什么称之为RuntimeException? 许多人将此错误误认为是程序运行时的错误,但它实际上意味着“一个异常是如此具有破坏性,以至于Java运行时环境需要停止”。换句话说,它的意思是:OutOfMemory、BrokerRAM、JRE的错误实现等等。。。基本上是这样的:程序无法运行,因为PC正在崩溃

只要我的2美分。 有人经历过同样的事情吗

PS:关于连续清除堆叠痕迹:

一旦看到异常,请尝试使用NullpointerException等捕捉它。 当您看到Nullpointerexception时,转到您的代码并删除stacktrace,只需记录.WARN(NullpointerOccured)并编写您的程序以重试等等

理想情况下,您可以重复,直到再也看不到Stacktrace。
当您无法看到stacktrace时,这意味着所有可能出错的问题都会得到解决(当然除了RuntimeException)

尝试时发生了什么?亲自尝试这些东西比在这里浪费时间要容易得多,也要快得多。没有研究证据。向下投票。
否则我需要深入挖掘
->是的,你需要深入挖掘,因为它应该被捕获。是的,但不是这样-我正在深入挖掘,希望进行一次健全性检查,以防我走错方向。“健全性检查”由Java编译器提供。在你浪费在这里的时间里,你本可以回答你的问题十几次,而且只会变得更糟。谢谢@Quoi-我发现了这一点,我正在研究的方法是巨大的,并且尝试了跨越整个2000行的方法。我看到的是调用这个特定方法的方法中的一个try-catch,而我应该看到这个巨大方法底部的catch块。。。与前面的答案相比,您没有添加太多内容,我的理解是RuntimeException是针对无法防止的异常的,因此编译器不会强制执行它们。