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是针对无法防止的异常的,因此编译器不会强制执行它们。