13-异常

nobility 发布于 2021-03-22 3023 次阅读


异常

异常继承关系

异常继承关系

抛出异常对象和声明异常

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();
  //第二个异常处理
}
此作者没有提供个人介绍
最后更新于 2021-03-22