这是我参与「第四届青训营 」笔记创作活动的第6天。
异常分类
- 编译错误:没有遵循语法规则,编译程序能够自己发现并提示我们错误的原因
- 运行时错误:程序在运行时发现不能执行的操作
- 逻辑错误:没有按照预期的逻辑顺序执行
继承情况
注意点
- RuntimeException需要记住
具体介绍
Throwable
有 Exception(异常) 和 ERROR(错误) 两个重要子类
区别:异常能被程序本身可以处理,错误是无法处理。
常用方法
1. 返回异常发生时的详细信息
public string getMessage();
2. 返回异常发生时的简要描述
public string toString();
3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
public string getLocalizedMessage();
4. 在控制台上打印Throwable对象封装的异常信息
public void printStackTrace();
ERROR
程序无法处理的错误,表示运行应用程序中较严重问题。
大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
Exception
异常语义描述
RuntimeException
| 异常名称 | 描述 |
|---|---|
| java.lang.ArrayIndexOutOfBoundsException | 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。 |
| java.lang.ArithmeticException | 算术条件异常。譬如:整数除零等。 |
| java.lang.SecurityException | 安全性异常 |
| java.lang.IllegalArgumentException | 非法参数异常 |
| java.lang.ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
| java.lang.NegativeArraySizeException | 数组长度为负异常 |
| java.lang.NullPointerException | 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。 |
IOException
| 异常名称 | 异常描述 |
|---|---|
| IOException | 操作输入流和输出流时可能出现的异常 |
| EOFException | 文件已结束异常 |
| FileNotFoundExcetion | 文件未找到异常 |
Other
| 异常名称 | 异常描述 |
|---|---|
| ClassCastException | 类型转换异常类 |
| ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
| SQLException | 操作数据库异常类 |
| NosuchFieldException | 字段未找到异常 |
| NoSuchMethodException | 方法未找到抛出的异常 |
| NumberFormatExcetion | 字符串转换为数字抛出的异常 |
| StringIndexOutOfBoundsException | 字符串索引超出范围抛出的异常 |
| IIIegalAccessException | 不允许访问某类异常 |
| InstantiationException | 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常 |
| ClassNotFoundException | 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。 |
异常处理机制
-
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象(包含了异常类型和异常出现时的程序状态等异常信息)并交付运行时系统
-
捕获异常:
- 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)
- 运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。
- 当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器
对于不同异常的处理
- 错误:对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
- 运行时异常(RunTime Exception) :由于运行时异常的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。
- 可查异常(Checked Exception) :对于所有的可查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。
常见的异常
-
抛InterruptedException(中断异常)的代表方法
java.lang.Object 类的 wait 方法
java.lang.Thread 类的 sleep 方法
java.lang.Thread 类的 join 方法(占用状态)
-
内存泄露最直接的表现就是抛出OutOfMemoryError错误
-
FullGC是老年代内存空间不足导致的
-
JVM崩溃可能是内存泄露,也可能是JVM参数配置错误
一些注意点
-
编译时的异常必须处理,运行时的一场交给虚拟机 运行时的异常可以不处理,总是交给虚拟机接管。
-
捕获到的异常不仅可以在当前方法中处理,还可以抛给它的上一级方法处理(而且有些异常需要几个方法协同处理,通常捕获到后部分处理,在抛给方法调用者)
-
选择抛出或捕捉的方案: 捕捉并处理知道如何处理的异常 抛出不知道如何处理的异常
-
throw 和 throws区别| throw:是语句,用于抛出异常对象。 throws:是关键字:关键字可以在方法上声明该方法要抛出的异常。
\