当java异常类库的异常种类不能满足需求,这时可以自定义异常。
自定义异常必须继承异常类库中意思相近的异常,或者所有异常类型的基类 - Exception。
/* * 自定义异常 * 自定义异常必须继承类库中意思相近的异常,或者所有异常的老大Exception。 * */ public class anotherException extends Exception {
//可以自定义一个有参构造函数,继承父类Exception。不写的话,系统就会自动生成一个无参的构造函数
public anotherException(String message){
super(message);
}
}
java中的异常链:
把捕获的异常,包装成一个新的异常,在这个新异常里添加对原始异常的引用,再抛出新异常。看上去就像链式反应,一个导致另外一个。这就是异常链。
public class RentalException { public static void main(String[] args){ RentalException rtExp = new RentalException(); try{ rtExp.rentalException2(); }catch (Exception e){ e.printStackTrace(); } } public void rentalException1() throws anotherException{ throw new anotherException("租金价格异常!"); } public void rentalException2(){ try { rentalException1(); } catch (anotherException e) { // e.printStackTrace(); RuntimeException newExp = new RuntimeException("系统出错,请稍后重试啦");//这里可以传参数 e,下面的initCause()即可省略 newExp.initCause(e);//包装异常,用于追查BUG(底层异常) throw newExp; } } }
输出情况如下:
java.lang.RuntimeException: 系统出错,请稍后重试啦
at ind.lxm.CarRent.RentalException.rentalException2(RentalException.java:21)
at ind.lxm.CarRent.RentalException.main(RentalException.java:7)
Caused by: ind.lxm.CarRent.anotherException: 租金价格异常!
at ind.lxm.CarRent.RentalException.rentalException1(RentalException.java:14)
at ind.lxm.CarRent.RentalException.rentalException2(RentalException.java:18)
... 1 more
关于异常的总结:
1. 处理运行时异常,采用逻辑合理规避同时辅助 try - catch 处理。
2. 多重catch 块后面,可以加一个 catch(Exception) 来处理可能会被遗漏的异常。
3. 对于不确定的代码,也可以加上try - catch,处理潜在的异常。
4. 尽量处理异常,切记只是简单的调用printStackTrace()去打印输出。
5. 根据不同的业务需求和异常类型决定如何处理异常
6. 尽量添加finally语句块释放占用的资源。