UM2L15——异常处理

本章代码关键字

1
2
try { } catch { } finally { }    //错误捕获
exception.getMessage() //获取错误消息

Java异常处理

Java中的异常捕获和C#中使用基本一致,语法:

  • 如果想要从报错类对象中获取信息,需要使用getMessage()

  • 不管之前的代码块是否发生异常 finally​ 中的内容都将执行,除了以下的几种情况:

    1. finally​ 语句块中发生异常
    2. finally​之前执行了System.exit()​退出程序
    3. 程序所在的线程销毁
    4. 关闭CPU
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try {
//需要进行异常捕获的代码块
} catch (NullPointerException ex) {
//空指针报错
//ex.getMessage()
//捕获异常信息
} catch (ArrayIndexOutOfBoundsException ex) {
//数组越界报错
//ex.getMessage()
//捕获异常信息
} catch (Exception ex) {
//ex.getMessage()
//捕获异常信息
} finally {
//不管之前的代码块是否发生异常 finally中的内容都将执行
//注意:以下几种情况下finally中内容不会执行
//1.finally 语句块中发生异常
//2.在finally之前执行了System.exit()退出程序
//3.程序所在的线程销毁
//4.关闭CPU
}

​Java中的常见异常类​

  • NullPointerException​:空指针异常
  • IOException​:输入输出异常
  • FileNotFoundException​:文件为找到异常
  • ArrayIndexOutOfBoundsException​:数组越界异常
  • NegativeArraySizeException​:数组元素个数为负数抛出异常
  • ClassCastException​:类型转化异常
  • ArithmeticException​:算数异常
  • ArrayStoreException​:数组包含不兼容的值抛出的异常
  • ClassNotFoundException​:未找到相应类异常

等等

​Java中自定义异常​

继承Exception​异常基类,实现一个有参构造函数,我们需要通过throw​关键字自己抛出异常对象

1
2
3
4
5
public class MyExcepton extends Exception{
public MyExcepton (String str) {
super(str);
}
}
1
2
3
4
5
6
7
8
9
10
11
try {
int i = -3;
//如果在这里发现了问题,可以主动抛出错误,该错误可以是自定义的类
if (i < 0)
throw new MyExcepton("数组容量不合法");
int[] ints = new int[i];
} catch (MyExcepton ex) {
System.out.println(ex.getMessage());
} finally {
System.out.println("异常捕获结束");
}

输出:

1
2
数组容量不合法
异常捕获结束

自定义异常类还有作用是可以通过自己声明的成员变量,来携带更多的报错相关消息

1
2
3
4
5
6
7
public class MyExcepton extends Exception{
public int i = 0;

public MyExcepton (String str) {
super(str);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
try {
int i = -3;
//如果在这里发现了问题,可以主动抛出错误,该错误可以是自定义的类
if (i < 0) {
MyExcepton ex = new MyExcepton("数组容量不合法");
ex.i = i;
throw ex;
}
int[] ints = new int[i];
} catch (MyExcepton ex) {
System.out.println(ex.getMessage() + ":数组容量为:" + ex.i);
} finally {
System.out.println("异常捕获结束");
}

输出:

1
2
数组容量不合法:数组容量为:-3
异常捕获结束

方法中抛出异常

如果某个方法可能发生异常,但是又不想在方法内处理这个异常,想在调用这个方法的外部进行处理
那么就可以可以使用throws​关键字在声明方法时抛出可能的异常,多个异常可以使用逗号分割
那么外部调用该方法时,发生对应异常时即可进行处理

注意:
继承时,覆盖有抛异常的方法时,该方法必须抛出相同的异常或者异常的子类
如果父类中方法抛出多个异常,那么子类的覆盖方法必须抛出那些异常的子集,不能抛出新异常

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void Test() throws ArrayIndexOutOfBoundsException, NegativeArraySizeException {
int[] ints = new int[-3];
}

public static void main(String[] args) {
try {
Test();
} catch (NegativeArraySizeException ex) {
System.out.println("容量为负数");
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("索引越界了");
}
}

输出:

1
容量为负数