繁体   English   中英

何时考虑在 Java 中捕获特定异常与一般异常

[英]When to consider catching Specific Exceptions Vs General Exception in Java

捕获像下面的选项 1 这样的特定异常非常常见,也被认为是捕获异常的保存方式,为什么选项 2 很少被考虑,因为它会变得多么冗长(不确定这是否是要使用的词!) ,这就是我的理解迄今为止。 我的问题是,是否还有其他情况应该考虑捕获选项 2(一般异常)而不是选项 1 之类的异常?

选项 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
}

选项 2 -> 一般例外:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM