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 语句包含要捕获异常类型的声明,当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); }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