一、异常的知识
1. 所有的异常类都是从 java.lang.Exception 类继承的子类
![在这里插入图片描述](https://img-blog.csdnimg.cn/f151470533e2444787f078d0db4123f1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATm9CdWcg44Wk,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. 解释各部分含义
![在这里插入图片描述](https://img-blog.csdnimg.cn/0d5f6aff6d2f44afbf7f0f58ecc34f7b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATm9CdWcg44Wk,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
3. 理解错误与异常
- 错误:比如说,你的代码少了一个分号,
那么运行出来结果是提示是错误 java.lang.Error;
- 异常:如果你用System.out.println(11/0),
那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException 的异常。
4. 异常如何工作?
- 最具代表的检查性异常是:用户错误或问题引起的异常,这是程序员无法预见的。
- 例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常是可能被程序员避免的异常。
- 与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误不是异常,而是脱离程序员控制的问题。
- 错误在代码中通常被忽略。
- 例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
5. 捕获异常
5.1 模板
try{
}catch(异常类型1 异常的变量名1){
}catch(异常类型2 异常的变量名2){
}catch(异常类型3 异常的变量名3){
}finally{
}
5.2 解释为什么这样写
- 一个 try 代码块后面可以跟随多个 catch 代码块。
- 处理原理:
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
- 无论是否发生异常,finally 代码块中的代码总会被执行。
- 只能有一个或没有finally代码块。
6. 抛出异常
- 什么是 throw:
throw 语句用来直接拋出一个异常
- throw 用法:
throw ExceptionObject;
ExceptionObject 必须是 Throwable 类或其子类的对象。
如果是自定义异常类,也必须是 Throwable 的直接或间接子类。
- throw 抛出异常的过程:
1. 当 throw 语句执行时,它后面的语句将不执行。
2. 此时程序转向调用者程序,寻找与之相匹配的 catch 语句,执行相应的异常处理程序。
3. 如果没有找到相匹配的 catch 语句,则再转向上一层的调用程序。
4. 这样逐层向上,直到最外层的异常处理程序终止程序并打印出调用栈情况。
7. 声明异常
- 什么是 throws:
声明异常
- 何时用 throws:
当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,
以便将该异常传递到方法的外部进行处理。
- throws 声明抛出异常的思路:
1. 使用 throws 声明的方法表示此方法不处理异常。
2. 异常应该由向上一级的调用者处理。(加入是 main 方法来调度)
3. 如果 main 方法也不知道如何处理这种类型的异常。
4. 那么 main 方法也可以使用 throws 声明抛出异常,该异常将交给 JVM 处理。
5. JVM 对异常的处理方法是,打印异常的跟踪栈信息,并中止程序运行。
- 当一个方法想声明多个异常:
如果有多个异常类,它们之间用逗号分隔。
例如:returnType method_name(paramList) throws Exception 1,Exception2,…{
…}
8. throw 和 throws
- throw 和 throws 的关系:
1. 可以通过 throws 关键字在方法上声明该方法要拋出的异常,
2. 然后在方法内部通过 <