异常处理总结
概况
总的来说异常分为两种:一、cheked Exception(检查异常),此异常在编译时候就会检测出来,我们必须进行捕获处理。二、unchecked Exception(非检查异常),此异常是在运行期才会抛出。例如我们常见的NullPointerException、IndexOutOfBoundsException等。
分析
对于这两种异常,它是什么情况下才会出现呢?我们又该怎么处理呢?
一、编译时出现的异常
1、由底层jdk向上抛出的异常,当我们在用IO流时如:
FileInputStream in = new FileInputStream(file);
2、由我们自己在代码块抛出异常如:
if(true){ throw new Exception(); }
编译时对于上述两种情况,我们必须强制处理该异常,方法一:就是对异常代码块进行try{}…catch{} 方法二就是把异常继续向上抛 throws **Exception,如下示例:
public void exampleA() { File file = new File("D:" + File.separator + "**.txt"); try { FileInputStream in = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } } public void exampleB() throws FileNotFoundException { File file = new File("D:" + File.separator + "**.txt"); FileInputStream in = new FileInputStream(file); }
二、运行时出现的异常。
1、由于我们代码逻辑不谨慎或者其它原因造成,如NullPointerException
2、我们人为的抛出异常,如继承了RuntimeException的自定义异常。
这种运行时异常在编译的时候我们是发现不了的,但是在运行期一旦出现,它也会中断程序的执行,这种无形中的bug,更加可怕,因此通常对运行时可能出现的异常,我们也将进行try{}。。。catch{}处理。
异常设计的建议
-
只在必要使用异常的地方才使用异常,不要用异常去控制程序的流程
-
切忌使用空catch块
-
检查异常和非检查异常的选择
-
注意catch块的顺序
-
不要将提供给用户看的信息放在异常信息里
-
避免多次在日志信息中记录同一个异常
-
异常处理尽量放在高层进行
-
在finally中释放资源