Java异常处理的12条军规总结

 更新时间:2019年04月08日 09:25:55   作者:张涛tom  
这篇文章主要给大家介绍了关于Java异常处理的12条军规,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

异常的概念

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

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。

异常发生的原因有很多,通常包含以下几大类:

•用户输入了非法数据。

•要打开的文件不存在。

•网络通信时连接中断,或者JVM内存溢出。

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-

在Java语言中,异常从使用方式上可以分为两大类:

  • CheckedException
  • UncheckedException

在Java中类的异常结构图如下:

  1. 可检查异常需要在方法上声明,一般要求调用者必须感知异常可能发生,并且对可能发生的异常进行处理。可以理解成系统正常状态下很可能发生的情况,通常发生在通过网络调用外部系统或者使用文件系统时,在这种情况下,错误是可能恢复的,调用者可以根据异常做出必要的处理,例如重试或者资源清理等。
  2. 非检查异常是不需要在throws子句中声明的异常。JVM根本不会强制您处理它们,因为它们主要是由于程序错误而在运行时生成的。它们扩展了RuntimeException。最常见的例子是NullPointerException 可能不应该重试未经检查的异常,并且正确的操作通常应该是什么都不做,并让它从您的方法和执行堆栈中出来。在高执行级别,应记录此类异常。
  3. 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变量类型及代码实例

    简单了解JAVA变量类型及代码实例

    这篇文章主要介绍了简单了解JAVA变量类型及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java web验证码实现代码分享

    java web验证码实现代码分享

    这篇文章主要为大家分享了java web验证码的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java线程阻塞中断与LockSupport使用介绍

    java线程阻塞中断与LockSupport使用介绍

    本文将详细介绍java线程阻塞中断和LockSupport的使用,需要了解更多的朋友可以参考下
    2012-12-12
  • Java 文件上传的实例详解

    Java 文件上传的实例详解

    这篇文章主要介绍了Java 文件上传的实例详解的相关资料,希望通过本文大家能掌握这部分内容,使用几种文件上传的方法,需要的朋友可以参考下
    2017-09-09
  • Springboot的自动配置是什么及注意事项

    Springboot的自动配置是什么及注意事项

    SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean和组件,目的是简化开发者的配置工作,本文介绍Springboot的自动配置是什么及注意事项,感兴趣的朋友一起看看吧
    2025-03-03
  • springboot CompletableFuture并行计算及使用方法

    springboot CompletableFuture并行计算及使用方法

    CompletableFuture基于 Future 和 CompletionStage 接口,利用线程池、回调函数、异常处理、组合操作等机制,提供了强大而灵活的异步编程功能,这篇文章主要介绍了springboot CompletableFuture并行计算及使用方法,需要的朋友可以参考下
    2024-05-05
  • Spring源码BeanFactoryPostProcessor详解

    Spring源码BeanFactoryPostProcessor详解

    BeanFactoryPostProcessor的执行时机是在Spring扫描完成后,Bean初始化前,当我们实现BeanFactoryPostProcessor接口,可以在Bean的初始化之前对Bean进行属性的修改,下面通过本文看下Spring源码分析-BeanFactoryPostProcessor的实例代码,感兴趣的朋友一起看看吧
    2021-11-11
  • JAVA生成xml文件简单示例

    JAVA生成xml文件简单示例

    这篇文章主要介绍了JAVA生成xml文件的相关资料,在Java中可以使用DOM或者JDOM来生成XML文件,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 解读什么是构造方法?能否被重写或重载?

    解读什么是构造方法?能否被重写或重载?

    这篇文章主要介绍了什么是构造方法?能否被重写或重载问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Springboot 如何使用 SaToken 进行登录认证、权限管理及路由规则接口拦截

    Springboot 如何使用 SaToken 进行登录认证、权限管理及路由规则接口拦截

    Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题,这篇文章主要介绍了Springboot 使用 SaToken 进行登录认证、权限管理以及路由规则接口拦截,需要的朋友可以参考下
    2024-06-06

最新评论