java - 何时考虑在 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
}
}
}
解决方案
您只是在问错误的问题,这是过早优化的典型示例。
您的两个选项之间的(可能为零)性能差异根本不重要。
请记住:您正在谈论处理刚刚抛出的异常。请放心:由于使用了选项 1 或 2,与一些假设的收益相比,创建该异常并收集其堆栈跟踪的成本要高出数千倍。
因此:您可以放心地忽略此处的性能。你只需做更容易阅读,更容易让人类读者理解你的代码的事情。这当然要求使用版本 1。正如评论指出的那样:实际上,您的选项 2 不等同于选项 1(因为它忽略了异常的子类)。因此,选项 2 不仅难以阅读和维护,而且很可能导致意外(错误)异常处理。
最后:您也是新手 Java 程序员的另一个常见问题的受害者。他们假设“你在源 java 中所做的”是运行时 java 性能的相关因素。但事实并非如此。java的真正性能来自于JIT,它努力将java字节码编译成机器码。您必须确保 JIT 能够做好工作(当然:避免代码中出现愚蠢的错误)。再说一遍:您的想法对“如何实现绩效”没有任何意义。
推荐阅读
- xml - 使用各种命名空间时如何在 XSL 中获取 XML 内容
- drupal - 使用 Drupal 使用 rest api
- c# - Xunit 中的模拟 Dll
- html - 如何在 HTML 中创建“复杂”标题?
- javascript - React-admin:使用文档中显示的自定义登录页面时出错
- javascript - 当我选择开始日期和结束日期时,剑道日期范围弹出窗口没有关闭。(角度 9)
- flutter - 使用可重用的小部件我如何将状态传递给该小部件
- c# - 如何通过 asp.net core 获取当前计算机的域?
- python - 添加 MaxPooling 2D - ValueError:新数组的总大小必须保持不变
- elasticsearch - 我丢失了 kibana 数据,但其他弹性搜索索引数据很好