Java 异常处理
一、异常的概述和分类
(一)什么是异常?
异常就是Java程序在运行过程中出现的错误。
(二)Throwable、Error、Exception
- Throwable: Java中所有错误(Error)和异常(Exception)的父类
- Error:一般是指与虚拟机相关的问题,如系统崩溃,内存空间不足等。它表示不希望被程序捕获或者是程序无法处理的错误,我们不予处理,因为这类一般是很严重的问题,我们处理不了。
- Exception:表示程序可以处理的异常,可以捕获且可能恢复。分为编译时异常和运行时异常。
1. 编译时异常: 非RuntimeException及其子类(必须显式处理,否则程序就会发生错误,无法运行)
2. 运行时异常: RuntimeException及其子类(可以显式处理,也可以不处理,不处理则是虚拟机默认处理)
为了更好地理解Error、编译时异常和运行时异常,可以举个例子:
张三骑自行车去旅游
①骑车途中掉链子,但张三自己可以修好(运行时异常)
②骑车途中轮子爆胎了,张三自己解决不了(严重问题Error)
③出发前发现自行车刹闸松了(编译时异常)
(三)虚拟机JVM是如何默认处理异常的
当遇到运行时异常时,如不作处理则交给JVM处理,JVM有一个默认的异常处理机制,其将该异常进行处理,并将该异常的名称、异常的信息和异常出现的位置打印在了控制台上,同时将程序停止运行(后面的代码不执行)
案例演示
(1 除 0)
public class MyTest5 {
public static void main(String[] args) {
int a=1;
int b=0;
System.out.println(a/b);
System.out.println("这句话被执行了");
}
}
运行:
发生了运行时异常并且我们没有处理,默认交给了JVM处理,从运行结果来看,发生异常后,后面的代码也没有执行。
显然,这样不作处理的方式会导致异常后的代码无法执行,于是我们自己处理,下面就介绍处理异常的方法。
二、异常处理
(一)try…catch的方式处理异常
try {
可能出现问题的代码 ;
}catch(异常名1 变量名1){
对异常的处理方式 ;
}catch (异常名2 变量名2){
对异常的处理方式 ;
}....
可以用快捷键ctrl+alt+T生成
注意事项:
1. try中的代码越少越好,放有可能出现问题的代码。try里面的代码一旦遇到相应的异常,就会执行catch里面的代码。catch里面的异常类名,就是你要对何种异常进行捕获
2. catch中要做处理,不能做空处理(不能将异常信息隐藏),哪怕是一条输出语句也可以,比如e.printStackTrace();
(打印异常的堆栈信息)。
3. 如果捕获多个异常,平级关系的异常谁前谁后无所谓,如果出现了子父关系,父类异常捕获必须在后面,否则,子类异常的语句不被执行。
4. 能明确异常种类的尽量明确,不要直接用大的异常类(Exception)来处理。(如果实在无法明确,最后再来一段catch(Exception e){......})
public class MyTest4 {
public static void main(String[] args) {
int a = 1;
int b = 0;
int[] arr = {
2, 4};
arr = null;
try {
System.out.println(a / b);
System.out.println(arr.length);
} catch (ArithmeticException e) {
System.out.println("除数为0了");
} catch (NullPointerException e) {
System.out.println("空指针异常");
} catch (Exception e) {
System.out.println("其他异常");
}
System.out.println("下面的代码执行");
System.out.println("下面的代码执行");
System.out.println("下面的代码执行"</