异常
Throwable下有两个直接子类:Exception和Error。
异常分为编译时异常和运行时异常。运行时异常不需要显式的抛出语句,可以自动抛出;如果显式地抛出运行时异常,编译器也不会强制程序员进行处理;如果出现运行时异常,解决办法就是修改相应的代码。而编译时异常会导致无法编译通过,所以需要及时处理。所以说,运行时异常比较特殊。
处理异常的方式有两种:一种是:try-catch(-finally),另一种是在定义方法时使用抛出声明throws,把异常抛给上一级,让上级进行处理,如:main()方法调用使用throws声明抛出了异常的方法func(),那么func()会把产生的异常抛给main(),如果main()处理不了,会继续抛给JVM,JVM一般处理不了,直接显示异常并终止程序。注:在throw抛出异常的地方,如果不使用try-catch进行处理,那么程序会在throw处终止并向上抛出异常。(在某种意义上说,throw和return的语义相同。只不过,return是正常返回,而throw是异常退出。)
不管try-catch如何处理异常,finally都会执行其代码块中的代码。(但是如果在try-catch中使用System.exit(),那么finally不再执行)finally一般用作清空资源所占内存。
继承中的异常(编译时异常,不包括运行时异常):
1. 当父类的方法抛出异常时,如果子类重写该方法:子类可以选择不抛出该异常。(即使不写也能抛出相应异常且不会报错。)如果子类选择抛出异常,那么抛出的异常必须是父类中该方法对应的异常类或者其子类。
2. 父类的方法不抛出异常的时候,子类不能抛出任何异常
3. 父类中方法不抛出异常,但子类重写该方法时又要抛出异常,此时不能用throws声明,只能使用try-catch处理异常。
Throwable类常用的方法:
getMessage(): 打印出入的字符串
toString(): 打印类名及传入的字符串
printStackTrace(): 打印完整的异常栈轨迹
自定义异常类:
异常类一般有两个构造方法:
一个是无参构造方法,另一个是有参构造方法,参数是String类型对象。
一般只需在构造方法中调用父类的构造方法,把参数传入,不用自己写逻辑。