Java异常处理

Java 异常处理

看的我人麻了,学 Python 的异常处理的时候也没有这么晕啊 +_+

throw/throws 关键字

在定义方法的时候,如果方法没有捕获到一个检查性异常,可以在声明末尾处用 throws 抛出异常
也可以用 throw 关键字抛出一个异常
感觉 throw和throws这两个关键字有甩锅的意思,把自己处理不了的异常交给上一级来处理,直到有父类能够处理,最终交给JVM来处理

下面定义了一个函数,返回传入的数组的指定索引的值

1
2
3
4
5
6
7
8
9
10
public static int getElement(int[] arr,int index) throws NullPointerException,ArrayIndexOutOfBoundsException{
if (arr == null){
throw new NullPointerException("传递的数组是null");
}
if (index >= arr.length){
throw new ArrayIndexOutOfBoundsException("索引超出范围");
}
int ele = arr[index];
return ele;
}
  • 使用 throw 的时候,可以在错误类的后面写入自己的话,这样报错的时候就能输出这句话
  • throws 可以抛出多个异常,用逗号隔开
  • throw 和 throws 有一个就可以,可以不两个都写

捕获异常

这里就和 Python 的差不多了,使用try和catch关键字来捕获异常
格式:

1
2
3
4
5
try{
//程序代码
}catch(ExceptionName e){
//Catch 块
}
  • catch 语句包含要捕获异常类型的声明,当try代码块中发生一个异常时,后面的 catch 块就会被检查
  • 如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,交给 catch 处理
    实例:
    1
    2
    3
    4
    5
    6
    public static void readFile(String filename){
    if (filename==null){
    throw new NullPointerException("没有该文件");
    }
    System.out.println("打开了文件");
    }
  • 传入一个文件名,如果传入的是 null,则抛出异常
1
2
3
4
5
6
7
8
9
10
11
try {
readFile(null); //调用方法,传入名字为null
}catch (NullPointerException e){ //捕获异常,并进行处理
System.out.println("没有"); //直接输出没有文件
System.out.println("================");//分割线
System.out.println(e.toString());//输出异常的名称,并输出定义好的语句
System.out.println("================");
System.out.println(e.getMessage());//只输出定义好的语句
System.out.println("================");
e.printStackTrace();//红字输出异常信息,并输出定义好的语句
}

输出:

1
2
3
4
5
6
7
8
9
没有
================
java.lang.NullPointerException: 没有该文件
================
没有该文件
================
java.lang.NullPointerException: 没有该文件
at yichang.tryCatch.readFile(tryCatch.java:31)
at yichang.tryCatch.main(tryCatch.java:17)

finally 关键字

无论 try 中的语句是否发生异常,都会被执行
实例:

1
2
3
4
5
6
7
try {
readFile(null);
} catch(NullPointerException e){
e.printStackTrace();
} finally{
System.out.println("资源释放");
}

自定义异常

异常也是一个类,可以自己定义异常
实例:

1
2
3
4
5
6
7
8
9
10
11
public class myException extends Exception{
private int amount;

public myException(int amount) {
this.amount = amount;
}

public int getAmount() {
return amount;
}
}

里面的构造方法可以理解为一旦这个类被实例化了(出现了这个异常),会执行的代码
从别的地方拿来的注意事项:

  • 所有异常都必须是 Throwable 的子类
  • 如果希望写一个检查性异常类,则需要继承 Exception 类
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类

看着不难,但就是不知道为什么,脑子里面就是有无法理解的感觉,但应该算是理解了 (⊙﹏⊙)b