[英]If RuntimeException is thrown, can it be caught as an Exception?
如果我有一个抛出RuntimException
子类的try
块,后续的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
。 但是我有一些不符合这种方式的生产代码。 很明显,如果答案是否定的,那就是我的答案; 否则我需要深入了解为什么我的代码坏了。 提前致谢!
RuntimeException
派生自Exception
,因此它将被捕获。
说完这个, 不要这样做 ! 应该防止运行时异常,而不是捕获。
是。 它将捕获RuntimeException
但是如果在catch块中出现任何Exception
,则必须再次捕获。
我建议你进行本地部署并调试代码。
如果catch(Exception)没有捕获您的RuntimeException,那么您的应用程序的行为方式与您的想法不同。
try {
throw new RuntimeException();
} catch (Exception e) {
System.out.println("Caught "+e);
}
版画
Caught java.lang.RuntimeException
是。 可以捕获RuntimeExceptions。 可以捕获Throwable的所有子类。
是的,你可以捕获RuntimeException ...但我认为它不是一个好方法,如果你抓住它你应该正确管理它。 否则结果就在你手中。 最好的方法是将它留给JVM。 JVM将处理它。
是的,你的想法是正确的,我认为知道回答“只是编写代码”的最好方法,让代码告诉你答案。 你可以看到以下简单的示例代码:
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();
}
}
我是IT的项目经理,我和我的开发人员一遍又一遍地争论,他们根本不在乎。 浏览网络,甚至大多数人都主张捕捉和投掷RuntimException ......每当我看到它,经历了10年的经验后,我会对这次难以接受的事情感到非常愤怒....
规则1:
如果没有捕获RuntimeException,永远不要在Program中抛出runtimeexception。
规则2:
只捕获一个Runtimeexception,以便真正导入与您的软件无关的东西 :例如发送邮件到操作紧急转移,记录异常,重启服务器....
原因是在良好的软件中,日志文件中没有堆栈跟踪。 当开始代码感到不舒服时,请执行以下操作:
创建新类DevelopmentException扩展异常。 然后goahead并编写代码并最初捕获异常。 然后你重新抛出它作为你自己的发展特征。 在捕获它的方法中,您记录它。
现在:每天为你个人的DevelopmentException grep。 如果你发现这意味着还有工作要做。 进入你的代码,看看Exception来自哪里,并事先捕获它。
理想情况下,您再也不会在程序的这一部分中看到DevelopmentException。 重复,直到您的软件中有0个Stacktraces,并且您已经完善了异常处理。
抛出和捕获运行时异常的最大问题是编译忽略它。 所以这意味着当你的一个同事写一个预订界面并在缺少一个值时抛出RuntimeException(是的,ppl真的这样做)......编译器不会告诉你可能存在运行时异常。 现在,当你没有抓住它时,你的程序可能只是关闭而没有任何记录。
为什么叫做RuntimeException? 许多人在程序运行时错误地将其视为错误,但它实际上意味着“异常具有极大的破坏性,以至于Java Runtime Environment需要停止”。 换句话说,它meand:OutOfMemory,BrokenRam,JRE的FaultyImplementation等......基本上告诉你的东西:程序因为PC崩溃而无法运行....
只需2美分。 有人经历过同样的事吗?
PS:关于连续删除堆栈跟踪:
一旦看到异常,就尝试使用例如NullpointerException来捕获它。 当你看到Nullpointerexception转到你的代码并删除堆栈跟踪,只是log.WARN(NullpointerOccured)并写你的程序重试等等...
理想情况下,你重复,直到你再也看不到Stacktrace。 当你看不到堆栈跟踪时,意味着所有可能出错的事情都会被处理掉 (当然除了RuntimeException)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.