刚做项目的时候一直分不清RunTime异常和checked异常,还是为了找工作,又重新把异常的知识过了一遍,参考书籍:《Java编程思想》、《疯狂Java讲义》。以下简单梳理了感觉蛮重要的几个点:
1、一直分不清Runtime异常和checked异常,最后有人跟我说继承自RuntimeException类的就是RunTime异常,其他的是checked异常,就这样吧T_T
2、JVM处理异常的方式:打印异常的跟踪栈消息,并终止程序运行。
3、finally()方法总是会执行,用于回收资源。当执行try、catch块中的return、throw前会执行finally()方法,所以不能在finally()中使用return、throw。一旦使用,将会导致try、catch块中的return、throw语句失效。
4、try块里声明的变量是代码块内局部变量,在catch内无效。
5、当有多个catch时,先小后大。
6、子类方法声明抛出的异常不能大于或多于父类方法声明抛出的异常。
7、当catch中throw checked异常时,一定要声明抛出异常;throw Runtime异常时不必声明。
7、不应该把底层的原始异常直接传给用户,通常的做法是捕获原始异常,把原始异常记录下来(logger),然后抛出一个包含对用户的提示信息的新的业务异常(异常转译,职责链模式)。通过将cause对象传入传入新的业务异常,可以在需要时追踪到最原始的异常信息。但是在最后提到的反模式的文章中说:不要同时进行“抛出”和“记录”两种操作。同时进行这两类操作会对同一个问题产生多种log消息,这会给运维人员分析日志带来麻烦。是指上层调用者还会logger吗?不知道是什么情况了。。。
异常处理规则:
1、把大块的try块分割成多个小try块,对异常分别捕获并处理异常。
2、checked异常必须捕获处理或抛出。
3、对于Runtime异常尽量不要处理。
4、当程序员需要自行抛出异常时(自己无法在程序中解决时),推荐使用Runtime异常。
5、捕获异常后进行处理:
- 对异常进行适当的修复,然后绕过异常发生的地方继续执行;
- 用别的数据进行计算,以代替期望的方法返回值;
- 提示用户重新操作;
- 重新抛出新异常(异常转译);
常见的Runtime异常:
- ArithmeticException 算术异常
- ClassCastException 类型强制转换异常
- IllegalArgumentException 传递非法参数异常
- IndexOutOfBoundsException 数组越界异常
- NullPointerException 空指针异常
- ArrayStoreException 向数组中存放与声明类型不兼容对象异常
- NumberFormatException 数字格式异常 extends IllegalArgumentException
常见的Checked异常:
- ClassNotFoundException 无法找到指定的类异常
- IllegalAccessException 当前正在执行的方法无法访问指定类、字段、方法或构造方法
- InstantiationException 实例化异常
- IOException I/O异常
- SQLException 数据库异常