有段时间没更新一文读懂系列了,这个系列主要还是帮大家梳理一些大家日常都会用到,都了解但是理解不透彻的一些知识点,今天介绍下Java的Exception和Error。
Exception和Error都是我们在日常Java开发中每天必遇到的,大家都知道可以对Exception有两种做法要么try-catch,要么throw到上层去处理,但是大家是不是对这两种处理方法有什么区别?遇到Exception该如何处理?Exception和Error区别?都不能解释的太清楚,如果你解释不清,那么请继续往下看,我们就这些问题进行阐述,让大家能够真正理解Exception和Error。
Exception和Error区别
Exception和Error都继承自Throwable,在Java中体系中只有继承了Throwable的实例对象才可以被throw或catch。Exception是程序运行过程中可以预料的意外,可能应该被捕获进行相应的处理,Exception分为可检查异常和不可检查异常,可检查异常在源码里必须显式进行捕获一般IDE也都会提示我们进行捕获或抛出,不检查异常就是最常见的运行时异常,这类错误只有在运行的过程中才会发生,例如NullPointException、IndexOutOfBoundException之类的。Error是指在正常情况下,不太可能出现的情况,大部分的Error都会导致程序Crash不可恢复,所以这类Error一般不需要进行catch。
Exception应该怎么处理
1)catch明确的异常类型
在catch异常的时候尽量捕获类型明确的异常,不要为了省事同意捕获Exception,这样很容易捕获我们不希望捕获的异常,因为有些异常我们是希望能够抛出的而不是捕获进行处理。
2)不要捕获Error
因为Error一般是我们无法恢复的异常,所以不要去捕获,我们一般是处理不了OutOfMemoryError之类的错误的。
3)不要简单的在系统终端打印异常
见过很多新手写的代码在catch代码块里只是将exception堆栈信息进行了简单的打印例如System.out.ptintln或者是e.printStackTrace,要知道在你自己开发电脑上这样是没问题的,你可以很方便的查看错误异常信息,但是这样的代码一旦上了生产环境,真的发生异常的时候我们还能看到吗?System.out是输出到console终端,可能在你启动的时候根本没有指定输出IO,e.printStackTrace是输出到标准错误流,但是生产环境可能你根本不知道标准错误流在哪里。
所以对于异常还是最好乖乖的在自己的logger中记录下来,以备发生异常的时候可以在日志中查到。
异常捕获性能影响
1)try-catch代码会产生额外的性能开销,会影响到JVM对代码的优化,所以建议只捕获有必要的代码段,不要整段代码都放到try中。
2)实例化一个Exception都会对当前的堆栈内容进行快照,这是非常消耗性能的操作,如果异常集中发生会对系统性能产生很大影响。
统一异常处理
为了避免开发人员在代码中随意处理异常,现在业界比较流行的一种做法就是对项目中的异常集中统一处理,开发人员只需要在业务代码中抛出异常就可以了,然后统一在一个ExceptionHandler中进行处理就可以了,Spring也提供了统一处理的相关类可以通过@RestControllerAdvice 类注解声明该类为统一异常处理类,那么所有抛出的异常只要没有被catch最终都会进到这个类中。
当然异常进来后,我们还需要对相应的异常进行处理,Spring也提供了@ExceptionHandler注解可以方便的定义某种Exception类型的处理方法,这样就可以避免所有开发人员自成一套的异常处理方法了,统一在一个地方维护。
@RestControllerAdvice
public class HOPExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 处理空指针异常
*/
@ExceptionHandler(NullPointException.class)
public Response handleHOPException(HOPException e){
Response r = new Response();
r.put("returnCode", e.getReturnCode());
r.put("returnMsg", e.getReturnMsg());
r.put("errorCode", e.getErrorCode());
r.put("errorMsg", e.getErrorMsg());
logger.error(new Date() + ": " + e.getMessage(), e);
return r;
}
}
总结
上面介绍了下Java的Exception和Error的区别和常见的处理方案,现在对这两个类型是不是有比较深入的了解了,希望能够对大家有帮助。
网友评论