基本异常
抛出异常后,在堆中新建一个异常对象,从当前环境中弹出对象的引用,异常处理程序开始接管程序,寻找一个恰当的地方继续执行程序
恢复到某个稳定点
重点:如果异常发生,程序不会沿着正常的路走下去
异常参数
异常对象两个构造器:一个默认无参构造器,一个参数为字符串的构造器
new一个异常对象后,对象的引用传给throw
Throwable:异常的根类
捕获异常
监控区域:一段可能出现异常的代码,后面跟着处理异常的代码
try块
里面放置所有可能出现异常的代码
异常处理程序
catch:接受一个异常处理
终止与恢复
终止:错误严重,程序不能回来继续执行
恢复:调用新的方法可以处理错误,程序能继续执行
创建异常类
java中只能继承异常类
类名就说明了异常信息
package com.company;
/**
* @ClassName ExceptionTest
* @Description
* @Auther liuxiansen
* @Date 2020/3/30 8:10 下午
**/
public class ThemeNotFoundException extends Exception {
public ThemeNotFoundException(){
}
public ThemeNotFoundException(String msg){
super(msg);
}
}
异常说明
throws:后面接一个潜在异常类型的链表
捕获所有的异常
Exception:异常类型的基类(编程相关),还有其他的基类,放在最后捕获异常,放置抢了其他的异常
方法:
- getMessage
- getLocalizedMessage
重新抛出异常
package com.company;
/**
* @ClassName Test
* @Description
* @Auther liuxiansen
* @Date 2020/3/29 8:55 上午
**/
public class Test{
public static void main(String [] args) throws Exception {
int a = 0;
try {
} catch (Exception e){
throw e;
}
}
}
catch捕获异常后重新抛出,后面的catch就不会捕获了
异常链
异常链:捕获一个异常后想抛出另一个异常
JDK1.4后,可以使用cause对象作为参数,表示原始异常
三个基本异常类提供了cause参数构造器
- Error
- Exception
- RuntimeException
其他的异常类只能使用initCause方法
package com.company;
/**
* @ClassName ExceptionTest
* @Description
* @Auther liuxiansen
* @Date 2020/3/30 8:10 下午
**/
public class ThemeNotFoundException extends Exception {
public ThemeNotFoundException(){
}
public ThemeNotFoundException(String msg){
super(msg);
}
public ThemeNotFoundException(String msg,Throwable cause){
super(msg,cause
);
}
}
使用Cause参数
java标准异常
Throwable这个类表示所有可以被作为异常抛出的类
继承Throwable的类可以分为两种类型:
- Error:编译时和系统错误(一般不需要关心)
- Exception:被抛出的基本类型,运行时故障
java程序员一般只关心基本类型Exception
异常的基本概念:名称表示发生的问题
RuntimeException:运行时异常,JVM自动捕获抛出,比如NullPointerException
使用finally进行清理
无论try中的代码是否抛出异常,finally中的代码都会执行
package com.company;
/**
* @ClassName Test
* @Description
* @Auther liuxiansen
* @Date 2020/3/29 8:55 上午
**/
public class Test{
public static void main(String [] args) throws Exception {
int a = 0;
try {
} catch (RuntimeException e){
throw e;
} catch (Exception e){
throw e;
} finally {
System.out.println("jj");
}
}
}
什么时候用finally:把内存之外的资源恢复到初始状态,比如打开的文件或网络连接,或者某个开关
即使涉及到break continue,finally也会执行