捕获一般异常和捕获特定异常之间的深度差异是什么

时间:2019-05-02 11:10:26

标签: java

捕获诸如下面的选项1之类的特定异常非常常见,并且也是捕获异常的最简便最佳方法。为什么很少考虑选项2的原因是它变得难以理解,这就是我对“为什么”的了解。 我的问题是,像选项2(常规异常)这样的深度风险捕获异常是什么?我知道应该有,我想知道。 请原谅我的语法。

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

我知道在这个问题上我可能会失去部分小代表,但我仍然需要一个答案。

1 个答案:

答案 0 :(得分:6)

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

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

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

因此:您可以在此处安全地忽略性能。您只需做一些易于阅读的代码,并使人类的代码读者更容易理解。当然,哪个命令指示使用版本1。正如注释所指出的:实际上,您的选项2不等同于选项1(因为它会忽略子类的例外)。因此,不仅选项2难以阅读和维护,而且很有可能导致意外的(错误的)异常处理。

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