异常的概念

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误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条军规总结相关推荐

  1. java 异常管理员_Java异常处理机制

    Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流.为了能够及时有效地处理程序中的运行错误,必须使用异常类. 一.异常简介 在程序中, ...

  2. java 可控异常_java异常处理,重新认识java异常,java7异常处理的新特性!

    原标题:java异常处理,重新认识java异常,java7异常处理的新特性! 在程序中,错误可能产生于程序员没有预料的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据.试图打开一个根本不 ...

  3. java 抛出异常效率_Java异常处理机制

    与C++.python,Ruby一样,Java也有一个异常处理机制,当程序出现异常时,系统会自动生成一个Exception对象通知程序去处理.之所以这样设计目的在于使程序有更好的容错性和可读性,实现业 ...

  4. java 常见错误_Java常见错误的十大列表(前100名!)

    java 常见错误 前10名名单非常受欢迎,有趣且内容丰富. 但是有很多! 如何选择合适的? 这是一个元前10名列表,可帮助您找到前10名的前10名列表. 在更令人讨厌的笔记上: SELECT TOP ...

  5. java最佳字体_Java专业人员的12个最佳薪酬国家

    java最佳字体 Here you will know about some best paying countries for java professionals, programmers or ...

  6. java异常应用_Java异常处理机制 —— 深入理解与开发应用

    本文为原创博文,转载请注明出处,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Excep ...

  7. java刷新操作_java实现删除某条信息并刷新当前页操作

    我就废话不多说了,大家还是直接看代码吧~ //执行的是删除信息的操作 String a=request.getParameter("name"); a = URLEncoder.e ...

  8. java 异常类_Java异常处理

    Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你 ...

  9. java 常见 错误_JAVA几个常见错误简析

    JAVA几个常见错误简析 Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.下面就来和小编一起看看JAVA几个常见 ...

最新文章

  1. AI不会很快取代作家——但未来可能比你想象的更近
  2. WPF 自定义标题栏 自定义菜单栏
  3. Java各种数据类型详细介绍及其区别
  4. linux启动lsyncd服务,Ubuntu下lsyncd实现远端实时同步配置
  5. 计算机基础及wps office应用_自考本科计算机应用基础考试大纲
  6. 光纤收发器不同品牌之间的兼容性互通
  7. QT出现“undefined reference to `vtable for’”解决方法
  8. linux 串口读取陀螺仪,stm32读取陀螺仪MPU6050发送数据到串口
  9. java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810
  10. Java-Hashmap
  11. python输出命令_Python 输出命令行进度条
  12. 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
  13. ajax请求到参数太大获取参数失败问题,Ajax请求参数较长导致请求失败
  14. setsockopt设置socket状态
  15. 开源,才是科技巨头的最佳实践!| 技术头条
  16. 贺利坚老师汇编课程56笔记:CMP指令
  17. curl针对HTTP的相关使用方法
  18. 网路收报流程-网桥的处理流程(br网桥)(四)
  19. AngularJS开发指南10:AngularJS依赖注入的详解
  20. Linux系统封装及配置

热门文章

  1. 使用ST05研究customer product id存储逻辑
  2. How AET fields are retrieved from backend
  3. GT_HEADERGUID_LIST
  4. SAP ABAP实用技巧介绍系列之 How is configuration data loaded
  5. 在AWS控制台里根据需要打开指定的通信端口
  6. 如何调整SAP HANA studio里的字体大小
  7. 如何确保SAP OData服务的返回结构为JSON格式
  8. 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图
  9. 还在用SELECT COUNT统计数据库表的行数?Out了
  10. 变频器lpm故障码是什么_什么是变频器软故障,如何解决?