[英]When to consider catching Specific Exceptions Vs General Exception in Java
捕获像下面的选项 1 这样的特定异常非常常见,也被认为是捕获异常的保存方式,为什么选项 2 很少被考虑,因为它会变得多么冗长(不确定这是否是要使用的词!) ,这就是我的理解迄今为止。 我的问题是,是否还有其他情况应该考虑捕获选项 2(一般异常)而不是选项 1 之类的异常?
try{
TextIO.putf(s);
FileOutputStream mFileOutputStream = new FileOutputStream("/content/doc/test.pdf", true);
}catch (FileNotFoundException notfEx){
//Do something
}catch (NullPointerException nullEx){
//Do something
}catch(IllegalArgumentException illEx){
//Do something
}
try{
TextIO.putf(s);
FileOutputStream mFileOutputStream = new FileOutputStream("/content/doc/test.pdf", true);
}catch (Exception ex){
if(ex.getClass() == java.io.FileNotFoundException.class) {
//Do something
}else if(ex.getClass() == java.lang.IllegalArgumentException.class){
//Do something
}else if(ex.getClass() == java.lang.NullPointerException.class){
//Do something
}
}
}
您只是在问错误的问题,这是过早优化的典型例子。
两个选项之间的(可能为零)性能差异根本无关紧要。
请记住:您正在谈论处理刚刚抛出的异常。 请放心:由于使用选项 1 或 2,创建该异常并收集其堆栈跟踪的成本比某些假设收益高数千倍。
因此:您可以安全地忽略此处的性能。 您只需做一些更容易阅读,更容易让您的代码的人类读者理解的事情。 这当然要求使用版本 1。正如评论指出的那样:实际上,您的选项 2 并不等同于选项 1(因为它忽略了异常的子类)。 因此,选项 2 不仅难以阅读和维护,而且很可能导致意外(错误)的异常处理。
最后:您也是 Java 新手程序员另一个常见问题的受害者。 他们假设“您在源 Java 中所做的事情”是运行时 Java 性能的相关因素。 但事实并非如此。 java真正的性能来自于JIT,以及它把java字节码编译成机器码的努力。 您必须确保 JIT 能够很好地完成工作(当然:避免代码中出现愚蠢的错误)。 再说一遍:您的想法对“如何实现绩效”没有任何意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.