首页 > 解决方案 > 何时考虑在 Java 中捕获特定异常与一般异常

问题描述

捕获特定异常(例如下面的选项 1)非常常见,也被认为是捕获异常的保存方法,为什么选项 2 很少被考虑,因为它可能变得冗长(不确定是否要使用这个词!),这就是我的理解至今。我的问题是,是否还有其他情况应该考虑捕获选项 2(General Exception) 而不是选项 1 之类的异常?

Opt1 -> 特定例外:

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
}

Opt2 -> 一般例外:

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

标签: javaexception

解决方案


您只是在问错误的问题,这是过早优化的典型示例。

您的两个选项之间的(可能为零)性能差异根本不重要

请记住:您正在谈论处理刚刚抛出的异常。请放心:由于使用了选项 1 或 2,与一些假设的收益相比,创建该异常并收集其堆栈跟踪的成本要高出数千倍。

因此:您可以放心地忽略此处的性能。你只需做更容易阅读,更容易让人类读者理解你的代码的事情。这当然要求使用版本 1。正如评论指出的那样:实际上,您的选项 2 不等同于选项 1(因为它忽略了异常的子类)。因此,选项 2 不仅难以阅读和维护,而且很可能导致意外(错误)异常处理。

最后:您也是新手 Java 程序员的另一个常见问题的受害者。他们假设“你在源 java 中所做的”是运行时 java 性能的相关因素。但事实并非如此。java的真正性能来自于JIT,它努力将java字节码编译成机器码。您必须确保 JIT 能够做好工作(当然:避免代码中出现愚蠢的错误)。再说一遍:您的想法对“如何实现绩效”没有任何意义。


推荐阅读