一 异常概念:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
二异常体系:
2.1Throwable体系:
Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好
比感冒、阑尾炎
2.2 异常分类
- 编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
- 运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
三 异常处理
3.1 抛出异常throw
public class Demo03 {
public static void main(String[] args) {
// int[] arr = {11, 22, 333};
int[] arr = {};
int number = getNumber(arr);
System.out.println("number = " + number);
}
public static int getNumber(int[] arr) {
if (arr.length == 0) {
// 我们自己来产生一个异常
throw new Exception("大哥,数组长度为0啦");
}
int i = arr[arr.length - 1]; // 拿到数组最后一个
return i;
}
}
//注意 如果产生了问题,我们就会throw将问题描述类即异常进行抛出,也就是将问题返回给该方法的调用者。
3.2 声明异常throws
声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲
解该方式),那么必须通过throws进行声明,让调用者去处理。
声明异常格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
public static void main(String[] args) throws Exception {
// int[] arr = {11, 22, 333};
int[] arr = {};
int number = getNumber(arr);
System.out.println("number = " + number);
}
// 班长将肚子痛的问题告诉别人,让别人来处理
public static int getNumber(int[] arr) throws Exception {
if (arr.length == 0) {
// 我们自己来产生一个异常
throw new Exception("班长肚子痛");
}
int i = arr[arr.length - 1]; // 拿到数组最后一个
return i;
}
3.3 捕获异常try...catch
捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
语法如下:
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
public static void main(String[] args) {
int divde = divde(10, 0);
System.out.println("divide: " + divde);
}
public static int divde(int a, int b) {
try {
int c = a / b; // 可能会出现问题的情况(异常)
System.out.println("xxx");
return c;
} catch (Exception e) {
System.out.println("我处理了除数为0");
}
return 0;
}
3.4 finally代码块
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行
不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
finally代码参考如下:
public static void main(String[] args) {
divide(10, 0);
}
public static int divide(int a, int b) {
int c = 0;
try {
c = a / b;
System.out.println("cccc");
} catch (ArithmeticException e) {
System.out.println("我处理了除数为0...");
return -1;
} finally {
//不管有无异常,最终都会执行
System.out.println("我一定会走");
}
return c;
}