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

Wha*_*rps -5 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
}
Run Code Online (Sandbox Code Playgroud)

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 6

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

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

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

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

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

  • @Whales如果您事先知道您的问题会吸引不赞成票的人,那么不要对每个发表您不喜欢的评论的人感到恼火,而是尝试以一种不会首先引起不赞成票的方式来表达您的问题。还要注意,Stack Overflow并不是供初学者学习编程的地方-那里有无数的书籍和教程。即使是初学者也应确保他们的问题范围狭窄,写得很好,与MCVE一起提供,不是重复的,已经过预先研究的等等。所有这些都不能阻止您提出初学者类型的问题。 (3认同)
  • @Whales是什么让您觉得我被冒犯了?我不是-我只是向您提供一些建议,以便日后如何更好地解决问题。 (3认同)
  • @MarkRotteveel Duly指出了! (2认同)