异常(exception)
一、异常就是导致程序终止的一种指令流,异常会使程序终止执行。
二、Throwable类是java语言中所有错误和异常的超类,有Error和Exception 两种直接子类,Exception和Error的子类名都是以父类名作为后缀。
三、异常处理的原则:
- 谁调用谁处理
- 异常只能用于非正常情况,try-catch的存在也会影响性能;
- 需要为异常提供说明文档,比如Java doc,如果自定义了异常或某一个方法抛出了异常,我们应该记录在文档注释中;
- 尽可能避免异常.如NullPointerException;
- 异常的粒度很重要,应该为一个基本操作定义一个 try-catch 块,不要为了简便,将几百行代码放到一个 try-catch 块中;
- 不建议在循环中进行异常处理,应该在循环外对异常进行捕获处理(在循环之外使用try-catch);
- 自定义异常尽量使用RuntimeException类型的。
四、常见的Error:
- StackOverflowError:当应用程序递归太深而发生内存溢出时,抛出该错误。
五、常见的Exception:
- NullPointerException:空指针异常,一般指当对象为null的时候,调用了该对象的方法,字段.
- ArrayIndexOutOfBoundsException:数组的索引越界,(小于0或者大于等于数组长度)
- NumberFormatException:数字格式化异常,一般指,把非0~9的字符串转换为整数.
六、Throwable类的方法:
- (String) getMessage() //获取异常的描述信息,原因
- (String) toString() //获取异常的类型和异常的描述信息(一般不用)
- (void) printStackTrace() //打印异常的跟踪栈信息并输出到控制台,包含了异常的类型、原因及出现的位置(方便调试和修改,写在catch语句中)。(不肖用System.out.print();)。
七、throws和throw :
- throws用于标识函数暴露出的异常。
Eg:
private static int devide(int n1,int n2) throws Exception{}
- throw用于抛出异常对象。
- throws与throw的区别:1)thorws用在函数上,后面跟异常类名; 2)throw用在函数内,后面跟异常对象
八、捕获异常(try-catch语句块):
try{
编写可能会出现异常的代码
}catch(异常类型 e){
要处理异常的代码写这里
//记录日志/打印异常信息/继续抛出异常
}finally{
这里面的代码一定会执行(但虚拟机关闭时无法执行 System.exit(0);//退出JVM)
}
/*注意:
1)try和catch都不能单独使用,必须连用
2)一个catch语句,只能捕获一种类型的异常,如果需要捕获多种异常,就得使用多个catch语句.
3)代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获,不可能同时出现多个异常*/
送给大家一首歌,看到歌词共勉。
九、自定义异常:
- 含义:在开发中根据自己业务的异常情况来定义异常类。自定义一个业务逻辑异常: LogicException。
- 异常类如何定义:
- 方式1):自定义一个受检查的异常类:自定义类 并继承于java.lang.Exception.
- 方式2):自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException.
十、异常细节:
- RuntimeException 及其子类如果在函数中被throw抛出,可以不用在函数上声明;
- 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类;
- 如果父类抛出多个异常,那么覆写方法必须抛出那些异常的一个子集,不能抛出新的异常。