文章目录
1. 异常的分类
Throwable类(表示可抛)是所有异常和错误的超类,两个直接子类为Error和Exception分别表示错误和异常
其中异常类Exception又分为运行时异常和非运行时异常,这两个异常有很大区别,运行时异常也叫非受检异常,非运行时异常也叫受检异常
1.1 Error
Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutoMemoryError、ThreadDeath等,这些异常发生时,一般会选择线程终止
1.2 Exception
Exception是程序本身可以处理的异常,对于这类异常,程序应当尽可能去处理
1.2.1 运行时异常
运行时异常都是RuntimeException类以及它的子类异常,比如NullPointerException(空指针)、ArrayIndexOutOfBoundsException(数组越界异常)等,这些异常也是不检查异常,程序可以选择处理,也可以选择不处理,这类异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生
1.2.2 非运行时异常
非运行时异常都是除RuntimeException类以及它的子类异常之外的异常,这些类都属于Exception类,都是要接受检查的异常,比如IOException、SQLException,从程序语法角度看这类异常是必须要进行处理的异常,如果不处理,程序就不能编译通过
2.异常的处理
-
try catch处理方式
如果try代码块中的代码运行出现错误,那么catch代码块中的代码执行,但不影响后面代码运行
-
throws处理方式
向外抛出异常,让之后一个接收到该异常的方法去处理
2.1 try catch用法
package 异常;
/*
* 使用try catch
*
*
* */
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[5];
try {
for(int i = 0; i < 10; i++) {
arr[i] = i;
}
}catch(Exception e) { //这个位置可以利用多态,使用更大的类
System.out.println("数组不赋值");
}
System.out.println("-----------------");
}
}
try{
可能出现问题的代码
}catch(异常类型){
当产生对应异常类型时,会执行catch中代码
}finally{
无论如何都会执行的代码
}
- try、catch、finally三个语句不能单独使用,可以组成try…catch,try…finally、try…catch…finally,其中catch可以有多个,finally最多有一个
- try、catch、finally三个代码块中变量的作用域为代码内部,分别独立不能互相访问,如果在三个块中使用,需要把变量定义到这些块之外
- 多个catch块,最多只会匹配其中一个异常类且只会执行该catch块代码,而不会在执行其他catch块代码,且匹配catch语句的顺序是从上到下,也可能所有的catch块都不执行
- 先写catch子类异常,再写catch父类异常
- finally语句是无论try中有没有发生异常,都会执行的语句块,一般finally是程序提供的一个统一的出口,保证程序转到其他部分继续执行,finally通常做一些清除工作,如关闭文件,关闭资源等
2.2 throws和throw的区别
-
throws用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传递,谁调用找谁处理
- 用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者处理
- throws表示出现异常的一种可能性,并不一定会发生这些异常
-
throws用来抛出一个具体的异常对象
- 用在方法体内,跟的是异常对象
- 只能抛出一个异常对象
- 表示抛出异常,由方法内的语句处理
- throws抛出异常的一定有的异常,所以需要必须处理