原来这就是Java中的异常(abnormal),小白看完也懂了,学习总结③
自定义异常类
我们可已使用Java内置的异常类来描述在编程时发现的大部分异常情况。同样有些时候也可以自定义异常去描述特定业务产生的异常类型,所谓的自定义异常,就是定义一个类,继承Throwables类或者他的子类。
案例紧跟案例模块。
在方法中,我们限制18岁以下必须由亲友的陪同在可以入住,在Exception中我们设立了提示异常的信息。那么如果一个异常频繁出现,或者需要特定类型针对特定业务描述,那么我们就可以自己编造一个测试类来执行。
现在我们新建一个test类,HotelAgeException。让他继承自Exception类
在这人我们需要构建一个无参构造方法,并用super来调用父类Exception的代餐构造,传递信息。
然后在父类,需要修订新的throw语句,
然后在上面的main方法中,补全提示异常信息。如果可以还可以添加多重catch语句,补全更多其他类型的异常
让我们看看运行结果:
异常链
有时我们捕获异常后会在抛出另一个异常对象。
场景
比如有三个方法,testOne,testTwo,testThree三个方法,testOne方法抛出异常给testTwo,在此基础上,testTwo又抛出方法给testThree。
在我们的工程中,我们创建一个新的test类,新建是那个方法 testOne,testTwo,testThree,然后
- 在testOne方法中抛出酒店第一个年龄的异常,并且用throws语句抛出去
- 在testTwo,捕获testOne的异常,并且抛出新的异常,并且throws向外声明
- 在testThree中,捕获testTwo的异常,并且循环
- 最后在main方法中调用testThree的异常信息。
运行报错信息后发现,我们的异常报错之有Exception2,那么ex1 哪里去了呢?这是由于新抛出异常导致异常信息丢失。
解决
让我们先看看Java API的文档信息。
可以看到,它提供了这几种处理机制。可以通过构造方法单独增加参数也可以一起使用。其中,initCause(Throwable cause); 方法和上面的Throwable(Throwable cause);机制是一样的。
那么这样来说我们就可以这样做:
可以看到,异常发生的过程,以及原因都记录保留下来了。
异常链就是将异常信息一个一个串联起来,将底层的异常信息传递给上层,逐层抛出,形成的一种链条;
总结
异常在我们的程序中总是发生一些意外的情况,这些就是异常。利用java的异常处理机制,我们可以更好的提高程序的牢固性能。
在实际工作中,我们应当尽量去处理异常,而不是一贯的使用PrintStackTrace()打印输出异常。而且具体处理异常则需要根据业务的需求和异常的类型去做决定,最后尽量学会添加finally语句块去释放占用的资源。