异常
异常继承关系
抛出异常对象和声明异常
throw关键字
- 必须写在方法内部
- 后面new的对象必须是Exception及其子类对象
- 抛出指定异常对象,就得要在方法上使用throws关键字配合进行声明异常类型,强制要求调用者处理(RuntimeException及其子类对象除外)
throws关键字
- 必须写在方法声明处,小括号后面
- 声明的异常对象类型必须是Exception及其子类对象
- 方法内部使用throw关键字抛出多少个异常对象,则throws关键字声明多少个异常类型,用逗号分隔,并强制要求调用者处理(RuntimeException及其子类对象除外)
- 特殊的,若这多个异常有父子类继承关系,只需抛出父类即可
使用场景
进行方法参数校验,告诉调用者参数不合法
捕获异常对象
- RuntimeException及其子类异常对象可以不处理
- 避免finally中的return语句:若try、catch、finally中都有return语句,则永远都是返回finally中的return语句,若加入
System.exit(1)
语句后可以强制终止程序从而不会执行finally中的语句 - 子类重新父类有抛出异常方法时
- 子类方法与父类方法抛出异常保持一致
- 子类方法抛出父类异常的子类
- 子类方法也可不抛出异常
- 若父类无异常抛出时,子类有异常则只能捕获
try{
//可能产生异常的代码
}catch(IOException e){ //声明可能产生的异常对象并捕获异常
e.printStackTrace(); //打印异常对象详细信息
//第一个异常处理
//一般写入日志文件和页面提示信息
}catch(Exception e){
//可有多个异常处理,子类必须在上,若都未捕获到异常,则会交给jvm处理
e.printStackTrace();
//第二个异常处理
}finally {
//无论是否出现异常都会执行,一般用于资源释放
//try...catch...可以没有finally块,但是finally不能单独使用
}
自定义异常
public class MyException extends Exception{
//自定义异常命名规范以Exception结尾
//可继承Exception或RuntimeException类
//Exception必须强制处理
//RuntimeException可以不处理
public MyException() {} //定义空参构造
public MyException(String message) { //有参构造调用父类有参构造
super(message);
}
}
自动关闭接口
jdk1.7后新增一个自动关闭资源的接口,对于资源的释放需要调用close()方法,使用特殊try...catch语法处理就能实现自动调用close()方法
自定义类若想使用这种语法实现自动关闭的操作则实现AutoCloseable接口,实现close()方法即可
try (FileReader fileReader = new FileReader("file.txt");
FileWriter fileWriter = new FileWriter("file.txt")){
//try后括号中创建实现AutoCloseable接口的实现类的对象,多个则使用分号隔开
//可能产生异常的代码
}catch(IOException e){ //声明可能产生的异常对象并捕获异常
e.printStackTrace(); //打印异常对象详细信息
//第一个异常处理
}catch(Exception e){
e.printStackTrace();
//第二个异常处理
}
Comments NOTHING