【问题标题】:When to consider catching Specific Exceptions Vs General Exception in Java何时考虑在 Java 中捕获特定异常与一般异常
【发布时间】:2019-05-02 11:10:26
【问题描述】:

像下面的选项 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
    }
  }
}

【问题讨论】:

  • 更快?不是问题。我更担心代码和意图的清晰度。像这样的纳米优化并不重要。
  • 不相关,但比较 .getClass() 不会包含子类。因此(例如)IllegalArgumentException 的各种子类不会由您的 Do something 块处理。
  • 如果第一个选项在 JDK 的大多数实现中不是 非常轻微 更快,我会惊讶(不是说它...只是我会感到惊讶)。 但是我也真的不会担心这个,除非你发现这是你代码中的一个严重的热点,如果是这样的话,要么不使用Exceptions,要么压制他们与在此处选择正确的分支结构相比,创建堆栈跟踪可能会提供更大的性能提升。
  • 就两种不相关的语言提出一个问题是让您的问题因过于宽泛而被投票结束的途径。您需要提出具体而切题的问题。
  • 简单地分析两个实现并比较结果。

标签: java exception


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 别忘了选项 1 和 2 的作用不同。选项 1 将捕获异常类型及其所有子类,而选项 2 将仅处理特定类型。
  • @MarkRotteveel 注意到了!
  • 如果我害怕或不知道我的问题会带来否决票,那么我不会这样说:我知道我可能会在这个问题上失去部分小代表,但我需要一个答案。
  • @Whales 如果您事先知道您的问题会吸引反对票,那么与其对制作您不喜欢的 cmets 的每个人感到恼火,不如尝试以不会吸引人的方式表达您的问题首先投反对票。另请注意,Stack Overflow不是初学者学习如何编程的地方 - 有无数的书籍和教程。即使是初学者也应该确保他们的问题范围很窄、写得很好、附带 MCVE、不重复、已经过预研究等等。这些都不妨碍你提出初学者类型的问题。
  • @Whales 是什么让你觉得我被冒犯了?我不是 - 我只是为您提供一些关于如何在未来更好地解决问题的建议。
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2014-06-13
相关资源
最近更新 更多