一.异常
1.典型的错误Error:出现error的是代码有比较大的问题,比如:
方法递归调用,会发生栈内存溢出错误StackOverflowError
OutOfMemoryError:不断的向堆内存中创建对象的时候
2.Exception异常
可以捕捉住,然后让程序继续运行下去
Error和Exception有共同的父类Throwable
二.处理异常
1.积极处理
使用 try{
可能出现异常的代码
}catch(异常的类型){
出现异常后需要执行的代码
}
注意:(1)catch捕捉到的异常,他的类型要么是他本身的异常类型,要么是
他父类的类型,不能是子类的类型
(2)可以同时catch多个异常的类型,并且当catch多个异常类型的时候
子类必须在父类的前面(范围广的在范围窄的后边)
(3)一个catch语句中可以有多个平级的异常,可以用&&(并且)
和||(或者)符号连接
2.消极处理
在出现异常的代码块的方法中用throws关键字抛出异常,注意:抛出的异常
只能是他本身的异常,或者是他父类的异常,不能是子类的异常。
如果要调用有异常的方法,调用者必须处理他所调用的方法中的异常,如果不处理,最终会传给jvm,之后程序的运行就结束了。
三.异常的行为分类
![分类图](https://img-blog.csdn.net/20180812142400615?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvc2hpamluZmVpeGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
1.未检查异常
RuntimeException或它的子类
Error和它的子类
2.检查异常
Throwable
Exception以及他们的子类
注意:检查异常需要强制地配合try-catch或throws一起使用
四.主动抛出异常
new throw 异常对象();
注意:主动抛出的异常对象只能是Exception或是Error的子类对象
五.异常对象常见的方法
getMessage():获取异常的信息
printStackTrace()打印异常的跟踪信息
六.异常的传播
以方法调用的反方向进行传播
七.自定义异常
class MyException extends Exception{ // 检查异常
}
class MyException extends RuntimeException { // 未检查异常
}
八.异常使用时要注意的一些问题
1.不要吞掉异常:也就是,你在用try{可能产生的异常代码}catch(异常类型){出现异常时要执行的代码}语句块时,在出现异常时要执行的代码不能什么都不写。
2.与有返回值的方法连用时:
每一个catch语句块的代码区到要返回一个结果,我们可以返回一个自定义的值,用来提醒我们,比如:return -1; 或者用throw继续抛出这个异常
public class Exception5 {
public static int test(){
try {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int r = 1/n;
return r;
} catch (Exception e ) {
System.out.println(e.getMessage());
return -1; 方法一
throw e; 方法二
}
}
public static void main(String[] args) {
int r = test();
System.out.println(r);
}
}
3.重写方法与异常声明
当这个异常为检查异常时:a.子类的重写方法,不能抛出比父类更多的异常(子类的异常类型与父类的相等,或者是父类异常类型的子类,不能是父类异常类型的父类)
b.子类的重写方法也可以不抛出异常
当这个异常为未检查异常的时候不用遵守以上的规定
4.建议将检查异常包装成未检查异常重新抛出
九.finally
1.语法格式
try {
...
} catch(Exception e) {
} finally {
}
注意:finally语句块中的代码,无论是否发生异常,总是会执行
如果try catch 以及finally都出现了return语句, 以finally中的return为准
如果try 有return, 但finally中对返回的变量做了修改, 不会影响return的结果
异常及异常的处理
猜你喜欢
转载自blog.csdn.net/woshijinfeixi/article/details/81606444
今日推荐
周排行