什么是异常
运行期间出现的错误,而不是编译时的语法错误。
异常类的体系结构
异常类型
非检查性异常 | 说明 |
---|---|
RuntimeException java.lang | 包中多数异常的基类 |
ArithmeticException | 算术错误,如除以 0 |
IllegalArgumentException | 方法收到非法参数 |
ArrayIndexOutOfBoundsException | 数组下标出界 |
NullPointerException 试图访问 null | 对象引用 |
检查性异常 | 说明 |
---|---|
ClassNotFoundException | 无法找到想要创建对象的类文件 |
IOException I/O | 异常的根类 |
FileNotFoundException | 不能找到文件 |
EOFException | 文件结束 |
IllegalAccessException | 对类的访问被拒绝 |
NoSuchMethodException | 请求的方法不存在 |
InterruptedException | 线程中断 |
处理异常流程
抛出异常–》捕获异常–》处理异常
try…catch语句与finally语句
积极处理(自行处理);finally不是必须的。
try{
可能出异常的代码;
}cath(异常类型 异常名){
处理异常的代码;
}finally{
始终执行的代码————通常用来关闭资源或释放资源;
}
注意:
1.try与catch必须一起使用,且之间不能添加任何带按摩
2.catch可以定义多个catch捕获不同的异常类型
3.catch中的异常必须按照从小到大的顺序排序
4.对应finally代码中的语句,即使try和catch的代码块中使用return语句
或break语句,相关的finally代码块都会执行
5.当try或catch代码块中执行了System.exit(0);时,finally代码块不会被执行。
例如
try {
//System.exit(0);
FileInputStream file=new FileInputStream("说明.txt"); //不能找到文件
int[] j=new int[] {12,23,45}; //数组越界
System.out.println("代码执行完毕");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界异常");
} catch (Exception e){
System.out.println("最大异常类"); //catch从小到大排序
} finally {
System.out.println("这里是finally代码块");
}
throws关键字与throw语句
throws关键字(回避异常,消极异常)
定义: 发生异常时,自身对异常不处理,由调用方法的对象处理
作用: 定义在方法的声明上,告诉调用者可能抛出某项异常
方法中如果用throws关键字抛出:
非检查性异常: 上一级去除异常,直到不抛出异常;
检查性异常:
- 在调用该函数内try-catch,把异常处理掉。那么不往上一级抛出异常,程序正常执行,上一级方法并不知道曾经产生异常。
- 用throws声明方法抛出异常,不进行处理。谁调用谁负责处理
- 覆盖方法抛出异常时,可以抛出与被覆盖方法相同的异常或者被覆盖方法异常的子类异常。
格式: 方法() throws 异常类型 { 发生异常的代码块;代码块…}
public static void check() throws FileNotFoundException {
FileInputStream file=new FileInputStream("说明.txt");
}
throw语句
作用: 抛出特定的异常类型;
格式: throw 异常类的对象名
throw new NullPointerException();
注意:
- throw一旦抛出异常,后面的语句就不再执行。
- throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。不能单独使用,要么和try… catch…一起使用,要么和throws一起使用。
- throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象