Java为我们定义了非常多的异常处理,当程序运行出现问题之后,Java会将异常信息打印出来,我们可以很直观的看到问题的源头和原因,但是在我们开发中,会遇到各式各样的问题,Java原有定义的异常经常会不满足我们的使用,这时候我们就可以自定义一些异常,当程序运行过程中出现某些情况的时候,可以将我们自定义的异常抛出,自定义的异常信息中可以包含我们当前所遇到的情况详情,这样我们就可以很明确的知道了那块发生了什么问题或者知道那块不满足我们的预期要求。
自定义的异常类和普通类一样,只要继承于Exception或者Exception子类即可,我们可以在自定义的类里面重写构造函数,函数的参数为错误的原因,并且调用父类的构造函数,例如:publice MyException extends Exception { public MyException(String message) {super.(message)}},定义好异常之后,我们可以在程序运行到某一步之后,抛出该异常,可以方便我们查找问题。
自定义的异常和系统异常的使用方法一致,都是使用throw new MyException("密码不正确");进行异常的抛出。抛出该异常之后,我们可以在调用含有该异常的方法的时候,使用try {} catch(MyException e) {}进行捕获处理,当然我们也可以讲异常继续往上一级进行抛,让上一级的调用者进行处理,将异常继续往上抛的方式和系统异常一样,在方法的后面使用throws抛向上一级。
刚才说了自定义的异常和普通类一样,那么自定义的异常也是可以被继承,我们创建两个自定义的异常 ParentException和ChildException,其中ChildException继承于ParentException,在我们开发中,经常会有不同的情况进行不同的处理,例如在一个方法中可能出现ChildException,ParentException,Exception三种异常,我们使用try {} catch(Exception e){}进行捕获的时候,我们需要按照由子到父的捕获顺序,也就是说我们捕获异常的顺序为ChildException, ParentException, Exception,格式为 try {} catch (ChildException e){} catch (ParentException e){} catch (Exception e){},如果我们的调用顺序颠倒之后,程序无论发生任何异常都只会被Exception捕获,不会被子异常类捕获,原因是当程序catch到一个异常之后,就不会继续往下进行,而Exception是异常类的父类,只要发生异常就会被它捕获,所以后面的不会继续执行,所以在捕获异常的时候,顺序非常重要,否则程序打印的异常会和我们预期的不一样。