java异常处理
2016-07-15 13:10
337 查看
刚做项目的时候一直分不清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异常尽量不要处理。
4000
4、当程序员需要自行抛出异常时(自己无法在程序中解决时),推荐使用Runtime异常。
5、捕获异常后进行处理:
对异常进行适当的修复,然后绕过异常发生的地方继续执行;
用别的数据进行计算,以代替期望的方法返回值;
提示用户重新操作;
重新抛出新异常(异常转译);
6、如果当前层不清楚如何处理异常,就不要捕获,直接用throws抛出,让上层调用者来负责处理。
常见的Runtime异常:
ArithmeticException
算术异常
ClassCastException 类型强制转换异常
IllegalArgumentException 传递非法参数异常
IndexOutOfBoundsException 数组越界异常
NullPointerException
空指针异常
ArrayStoreException
向数组中存放与声明类型不兼容对象异常
NumberFormatException 数字格式异常
extends IllegalArgumentException
常见的Checked异常:
ClassNotFoundException 无法找到指定的类异常
IllegalAccessException
当前正在执行的方法无法访问指定类、字段、方法或构造方法
InstantiationException
实例化异常
IOException I/O异常
SQLException 数据库异常
下面附一篇感觉很赞的博文,讲异常处理反模式的: http://www.cnblogs.com/elaron/archive/2012/12/24/2831286.html
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异常尽量不要处理。
4000
4、当程序员需要自行抛出异常时(自己无法在程序中解决时),推荐使用Runtime异常。
5、捕获异常后进行处理:
对异常进行适当的修复,然后绕过异常发生的地方继续执行;
用别的数据进行计算,以代替期望的方法返回值;
提示用户重新操作;
重新抛出新异常(异常转译);
6、如果当前层不清楚如何处理异常,就不要捕获,直接用throws抛出,让上层调用者来负责处理。
常见的Runtime异常:
ArithmeticException
算术异常
ClassCastException 类型强制转换异常
IllegalArgumentException 传递非法参数异常
IndexOutOfBoundsException 数组越界异常
NullPointerException
空指针异常
ArrayStoreException
向数组中存放与声明类型不兼容对象异常
NumberFormatException 数字格式异常
extends IllegalArgumentException
常见的Checked异常:
ClassNotFoundException 无法找到指定的类异常
IllegalAccessException
当前正在执行的方法无法访问指定类、字段、方法或构造方法
InstantiationException
实例化异常
IOException I/O异常
SQLException 数据库异常
下面附一篇感觉很赞的博文,讲异常处理反模式的: http://www.cnblogs.com/elaron/archive/2012/12/24/2831286.html
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树