异常掌握几点:
1, 异常的思想:
将问题封装成对象的思想。
2, 异常的处理方式。
编译时异常:在函数上要声明,然后要么抛出,要么try。
什么时间try,什么时间抛throws?
异常你能处理的就try
异常你不能处理的就抛throws。
编译异常发生,只要没有处理,都要声明。
运行时异常:可以不用声明,可以直接抛出。
3, 抛出多异常,并多catch处理的原则
父类异常往后放。
4, 编译时检测异常和运行时异常
编译时异常:编译时期被检查到的异常,是可以预防修改的异常。
运行时异常:编译时期不被检查,运行时期发生的异常,一般这种异常都是调用者传递错误参数导致的,所以对于这种情况,应该让程序停止。
5, 自定义异常
自定义编译时异常:继承Exception或其子类。
自定义运行时异常:继承RuntimeException或其子类
可以调用父类构造方法指定异常抛出的信息:例如:
ZiException ( String message)
{
Super( message );
}
6, Throws和throw的区别
Throws:后跟异常名称,声明异常。
Throw :后跟异常对象,抛出异常并结束函数。
7, 异常的封装和转换
封装:将异常封装成一个对象,便于处理。
转换:将一些调用者不需要知道或者无法处理的异常在方法体中进行捕获、处理后,throw抛出且告知调用者一个他应该或者可以处理的异常。
8, finally的作用,try,catch,finally的组合形式
finally的作用:捕获异常后,不管怎样,都必须执行finally中的代码。在结束代语句return前执行。
1,try{} catch(){}finally{} // 不需要声明
2,try{} catch(){} // 不需要声明
3,try{} finally{} // 需要声明。 作用:不处理异常,关闭资源。
9, 异常在覆盖时的细节
1,父类方法中抛出了一个异常,那么覆盖子类方法中只能抛出父类抛出的异常或者其子异常。
2,如果父类方法中抛出了多个异常,那么覆盖子类方法只能抛出父类异常的子类异常。
3,父类方法中没有抛出异常,子类覆盖方法就不能抛出异常。
Exception
1,RuntimeException:其以及其子类都是运行时异常。
2,Exception其他的子类都是编译时检测异常。
如果函数上表示了异常,调用者一定要进行处理,要么try,要么throws,否则编译失败。
检测异常:必须声明,并要给出处理方式。
运行时异常:不需给出处理方式,因为这种异常会导致算术失败,无法继续,只能让程序停止,让调用者修改代码。不需要声明。将其抛出即可。
函数内部出现运行时异常时,只需对函数内部处理即可(结束程序),不用在函数上将其抛出。
函数上抛出了几个异常,调用者就要处理几个异常。
getMessage():获取异常信息。
toString() :获取异常的名称和异常的信息。
printStackTrace():打印信息,名称,位置到控制台。还可以存储到文件中(jvm的默认异常处理机制就是调用产生异常对象的printStackTrace方法)