异常
在Java等面向对象的编程语言中,异常本身是一个类
产生异常就是创建异常对象并抛出了一个异常对象。
Java中处理方式为中断处理
以下情况会抛出异常:
- 调用了一个会抛出 checked 型异常的方法(除了ErrorEx 和 RunTimeEx之外的),如FileInputStream构造器
- 检测到错误,利用 throws 抛出一个 checked 型异常
- 编写的程序出现错误
- JVM或者运行时库出现问题
前两个异常开发人员必须明白,否则当前线程会终止
java的内部错误(从Error继承)不需要在函数后面像 IOException 声明,
异常的产生过程:
二、异常的处理
java处理异常的五个关键字:try, catch, finally, throw, throws
2.1抛出异常throw
作用:
使用throw关键字在指定的方法中抛出指定的异常
使用格式:
throw new xxxException("异常产生的原因");
注意:
1.throw关键字必须写在方法的内部
2.throw关键字后边new的对象必须是Exception或者Exception的子类
3.throw关键字抛出指定的异常对象,就必须处理这个异常对象
throw关键字后边创建的是RuntimeException或者RuntimeException的子类对象,我们可以不处理,默认交给JVM处理
throw关键字后边创建的是编译异常,我们就必须处理这个异常,要么throws,要么try...catch...
4.子类抛出的异常只能是更特定的,比如 父类抛出了IOEx,子类不能抛出 IOEx的超类的异常声明
5.父类如果没有抛出 checked 型异常,子类也不可以抛出checked 型异常(如果不是checked型呢??)
2.2声明异常throws
作用:
当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象,
可以使用throws关键字处理异常对象,把锅抛给JVM处理 --> 中断处理
使用格式:
修饰符 返回值类型 方法名(参数列表) throws AAAException{
throw new AAAException("产生原因");
}
注意:
1.throws必须写在方法声明处2.throws后面声明的异常必须是Exception或者Exception的子类
3.方法内部如果抛出多个异常,throws后面也必须声明多个异常,
如果抛出的多个异常对象有父子类关系,直接声明父类4.调用了一个声明异常的方法,就必须处理声明异常,
要么继续使用throws声明抛出,最终交给JVM
要么try...catch...自己处理异常
2.4捕获异常try...catch
格式:
try {
可能产生异常的代码
}catch(定义异常的变量,用来接收try中抛出的异常对象) {
异常的处理逻辑,之后是如何处理异常对象
一般工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名) {
}
注意:
1.可以抛出多个异常对象,可以使用多个catch
2.try中产生异常,执行catch,之后继续执行try...catch之后的代码
如果try中没有产生异常,就不会进入catch,执行完try直接执行后续代码
try...catch与throw的区别:
try...catch可以执行后续程序
throw则是中断程序
2.5finally代码块
一定要执行的代码
无论异常发生不发生,都需要执行
而且出现程序跳转,部分代码会执行不到
格式:
try{
...
}catch() {
...
}
...
catch() {
}finally {
//无论是否异常均会执行的代码
}
注意:
1.finally必须和try一起使用
2.finally一般用于资源释放,程序最后均要资源释放
三、异常注意事项
1.多个异常分别处理
还可以执行后续代码
2.多个异常,一次捕获(try),多次处理(catch)
catch里边定义的异常变量,如果有父子类关系,那么子类的异常变量必须写在上边,否则报错(与多态知识相关)
对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),
当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。
3.多个异常一次捕获一次处理
catch中定义的变量可以接收try中的所有异常对象。
运行时异常被抛可以不捕获也不处理,给JVM(中断程序)
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
有return语句的话,永远返回finally中的结果
public static int demo4() {
int i = 0;
try {
return i;
} finally {
i = 12;
System.out.println("finally trumps return.");
return i;
}
}
//输出结果
finally trumps return.
12
5.子父类异常
①如果父类抛出多个异常,子类重写父类方法时,抛出
和父类相同的异常
或者父类异常的子类
或者不抛出异常
②父类方法没有抛出异常,子类重写时也不可以抛出异常,只能捕获处理,不能声明抛出
(父类异常什么样,子类异常就什么样)
经典面试题!!!!!!
public static int demo5() {
try {
return printX();
}
finally {
System.out.println("finally trumps return... sort of");
}
}
public static int printX() {
System.out.println("X");
return 0;
}
//输出结果
X
finally trumps return... sort of
0
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。