java 12错误_Java异常处理的12条军规总结
异常的概念
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。
异常发生的原因有很多,通常包含以下几大类:
•用户输入了非法数据。
•要打开的文件不存在。
•网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
在Java语言中,异常从使用方式上可以分为两大类:
CheckedException
UncheckedException
在Java中类的异常结构图如下:
可检查异常需要在方法上声明,一般要求调用者必须感知异常可能发生,并且对可能发生的异常进行处理。可以理解成系统正常状态下很可能发生的情况,通常发生在通过网络调用外部系统或者使用文件系统时,在这种情况下,错误是可能恢复的,调用者可以根据异常做出必要的处理,例如重试或者资源清理等。
非检查异常是不需要在throws子句中声明的异常。JVM根本不会强制您处理它们,因为它们主要是由于程序错误而在运行时生成的。它们扩展了RuntimeException。最常见的例子是NullPointerException 可能不应该重试未经检查的异常,并且正确的操作通常应该是什么都不做,并让它从您的方法和执行堆栈中出来。在高执行级别,应记录此类异常。
Error是最为严重的运行时错误,几乎是不可能恢复和处理,一些示例是OutOfMemoryError,LinkageError和StackOverflowError。它们通常会使程序或程序的一部分崩溃。只有良好的日志记录练习才能帮助您确定错误的确切原因.
在异常处理时的几点建议:
1永远不要catch中吞掉异常,否则在系统发生错误时,你永远不知道到底发生了什么
catch (SomeException e) {
return null;
}
2尽量使用特定的异常而不是一律使用Exception这样太泛泛的异常
public void foo() throws Exception { //错误的做法}
public void foo() throws MyBusinessException1, MyBusinessException2 { //正确的做法}
一味的使用Exception,这样就违背了可检查异常的设计初衷,因为调用都不知道Exception到底是什么,也不知道该如何处理。捕获异常时,也不要捕获范围太大,例如捕获Exception,相反,只捕获你能处理的异常,应该处理的异常。即然方法的声明者在方法上声明了不同类型的可检查异常,他是希望调用者区别对待不同异常的。
3Never catch Throwable class
永远不要捕获Throwable,因为Error也是继承自它,Error是Jvm都处理不了的错误,你能处理?所以基于有些Jvm在Error时就不会让你catch住。
4正确的封装和传递异常
不要丢失异常栈,因为异常栈对于定位原始错误很关键
catch (SomeException e) {
throw new MyServiceException("Some information: " + e.getMessage()); //错误的做法
}
一定要保留原始的异常:
catch (SomeException e) {
throw new MyServiceException("Some information: " , e); //正确的打开方式
}
5要打印异常,就不要抛出,不要两者都做
catch (SomeException e) {
LOGGER.error("Some information", e);
throw e;
}
这样的log没有任何意义,只会打印出一连串的error log,对于定位问题无济于事。
6不要在finally块中抛出异常
如果在finally中抛出异常,将会覆盖原始的异常,如果finally中真的可能会发生异常,那一定要处理并记录它,不要向上抛。
7不要使用printStackTrace
要给异常添加上有用的上下文信息,单纯的异常栈,没有太大意义
8Throw early catch late
异常界著名的原则,错误发生时及早抛出,然后在获得所以全部信息时再捕获处理.也可以理解为在低层次抛出的异常,在足够高的抽象层面才能更好的理解异常,然后捕获处理。
9对于使用一些重量级资源的操作,发生异常时,一定记得清理
如网络连接,数据库操作等,可以用try finally来做clean up的工作。
10不要使用异常来控制程序逻辑流程
我们总是不经意间这么做了,这样使得代码变更丑陋,使得正常业务逻辑和错误处理混淆不清;而且也可能会带来性能问题,因为异常是个比较重的操作。
11及早校验用户的输入
在最边缘的入口校验用户的输入,这样使得我们不用再更底层逻辑中处处校验参数的合法性,能大大简化业务逻辑中不必要的异常处理逻辑;相反,在业务中不如果担心参数的合法性,则应该使用卫语句抛出运行时异常,一步步把对参数错误的处理推到系统的边缘,保持系统内部的清洁。
12在打印错误的log中尽量在一行中包含尽可能多的上下文
LOGGER.debug("enter A");
LOGGER.debug("enter B"); //错误的方式
LOGGER.debug("enter A, enter B");//正确的方式
Thanks all. Happy Learning!!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。
java 12错误_Java异常处理的12条军规总结相关推荐
- java 异常管理员_Java异常处理机制
Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流.为了能够及时有效地处理程序中的运行错误,必须使用异常类. 一.异常简介 在程序中, ...
- java 可控异常_java异常处理,重新认识java异常,java7异常处理的新特性!
原标题:java异常处理,重新认识java异常,java7异常处理的新特性! 在程序中,错误可能产生于程序员没有预料的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据.试图打开一个根本不 ...
- java 抛出异常效率_Java异常处理机制
与C++.python,Ruby一样,Java也有一个异常处理机制,当程序出现异常时,系统会自动生成一个Exception对象通知程序去处理.之所以这样设计目的在于使程序有更好的容错性和可读性,实现业 ...
- java 常见错误_Java常见错误的十大列表(前100名!)
java 常见错误 前10名名单非常受欢迎,有趣且内容丰富. 但是有很多! 如何选择合适的? 这是一个元前10名列表,可帮助您找到前10名的前10名列表. 在更令人讨厌的笔记上: SELECT TOP ...
- java最佳字体_Java专业人员的12个最佳薪酬国家
java最佳字体 Here you will know about some best paying countries for java professionals, programmers or ...
- java异常应用_Java异常处理机制 —— 深入理解与开发应用
本文为原创博文,转载请注明出处,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Excep ...
- java刷新操作_java实现删除某条信息并刷新当前页操作
我就废话不多说了,大家还是直接看代码吧~ //执行的是删除信息的操作 String a=request.getParameter("name"); a = URLEncoder.e ...
- java 异常类_Java异常处理
Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你 ...
- java 常见 错误_JAVA几个常见错误简析
JAVA几个常见错误简析 Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.下面就来和小编一起看看JAVA几个常见 ...
最新文章
- AI不会很快取代作家——但未来可能比你想象的更近
- WPF 自定义标题栏 自定义菜单栏
- Java各种数据类型详细介绍及其区别
- linux启动lsyncd服务,Ubuntu下lsyncd实现远端实时同步配置
- 计算机基础及wps office应用_自考本科计算机应用基础考试大纲
- 光纤收发器不同品牌之间的兼容性互通
- QT出现“undefined reference to `vtable for’”解决方法
- linux 串口读取陀螺仪,stm32读取陀螺仪MPU6050发送数据到串口
- java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810
- Java-Hashmap
- python输出命令_Python 输出命令行进度条
- 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
- ajax请求到参数太大获取参数失败问题,Ajax请求参数较长导致请求失败
- setsockopt设置socket状态
- 开源,才是科技巨头的最佳实践!| 技术头条
- 贺利坚老师汇编课程56笔记:CMP指令
- curl针对HTTP的相关使用方法
- 网路收报流程-网桥的处理流程(br网桥)(四)
- AngularJS开发指南10:AngularJS依赖注入的详解
- Linux系统封装及配置
热门文章
- 使用ST05研究customer product id存储逻辑
- How AET fields are retrieved from backend
- GT_HEADERGUID_LIST
- SAP ABAP实用技巧介绍系列之 How is configuration data loaded
- 在AWS控制台里根据需要打开指定的通信端口
- 如何调整SAP HANA studio里的字体大小
- 如何确保SAP OData服务的返回结构为JSON格式
- 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图
- 还在用SELECT COUNT统计数据库表的行数?Out了
- 变频器lpm故障码是什么_什么是变频器软故障,如何解决?