异常

Java将异常分为两种:Checked异常和Runtime异常。Java认为Checked异常都是可以在编译阶段被处理的异常,所以它强制程序处理所有的Checked异常;

而Runtime异常则无须处理。Checked异常可以提醒程序员需要处理所有可能发生的异常。

所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常。

在大部分情况下,推荐使用Runtime异常,而不使用Checked异常。尤其当程序需要自行抛出异常时,使用Runtime异常将更加简洁。

很多时候,系统是否要抛出异常,可能需要根据应用的业务需求来决定,如果程序中的数据、执行与既定的业务需求不符,这就是一种异常。

由于与业务需求不符而产生的异常,必须由程序员来决定抛出,系统无法抛出这种异常。不管是系统自动抛出的异常,还是程序员手动抛出的异常,Java运行时环境对异常的处理没有任何差别。

如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显式捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理;

如果throw语句抛出的异常是Runtime异常,则该语句无须放在try块里,也无须放在带throws声明抛出的方法中:程序既可以显式使用try...catch来捕获并处理该异常,也可以完全不理会该异常,把异常交给该方法调用者处理。

常见的异常处理方式要么是try...catch,要么是在方法签名中声明抛出该异常。但在实际应用中往往需要更复杂的处理方式---当一个异常出现时,单靠某个方法无法完全处理该异常,

必须由几个方法协作才可完全处理该异常。也就是说,在异常出现的当前方法中,程序只对异常进行部分处理,还有些处理需要在该方法的调用者中才能完成,所以应该再次抛出异常,让该方法的调用者也能捕获到异常。

异常转译:程序先捕获原始异常,然后抛出一个新的业务异常,新的业务异常中包含了对用户的提示信息,这种处理方式被称为异常转译。---throw new XxxException(String msg);

异常转译把原始异常信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表现层,可以避免向上暴露太多细节,完全符合面向对象的封装原则。

异常链:捕获一个异常然后接着抛出另一个异常,并把原始异常信息保存下来是一种典型的链式处理,也被称为“异常链”。---throw new XxxException(Throwable cause);

原文地址:https://www.cnblogs.com/i-hard-working/p/10781124.html