Java Exception与Error的区别 | 青训营笔记

109 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第6天。

异常分类

  1. 编译错误:没有遵循语法规则,编译程序能够自己发现并提示我们错误的原因
  2. 运行时错误:程序在运行时发现不能执行的操作
  3. 逻辑错误:没有按照预期的逻辑顺序执行

继承情况

img

img

这里写图片描述

注意点

  1. 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文件时,抛出该异常。

异常处理机制

  1. 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象(包含了异常类型和异常出现时的程序状态等异常信息)并交付运行时系统

  2. 捕获异常

    1. 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)
    2. 运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。
    3. 当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

    潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器

对于不同异常的处理

  1. 错误:对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
  2. 运行时异常(RunTime Exception) :由于运行时异常的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。
  3. 可查异常(Checked Exception) :对于所有的可查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。

常见的异常

  1. 抛InterruptedException(中断异常)的代表方法

    java.lang.Object 类的 wait 方法

    java.lang.Thread 类的 sleep 方法

    java.lang.Thread 类的 join 方法(占用状态)

  2. 内存泄露最直接的表现就是抛出OutOfMemoryError错误

  3. FullGC是老年代内存空间不足导致的

  4. JVM崩溃可能是内存泄露,也可能是JVM参数配置错误

一些注意点

  1. 编译时的异常必须处理,运行时的一场交给虚拟机 运行时的异常可以不处理,总是交给虚拟机接管。

  2. 捕获到的异常不仅可以在当前方法中处理,还可以抛给它的上一级方法处理(而且有些异常需要几个方法协同处理,通常捕获到后部分处理,在抛给方法调用者)

  3. 选择抛出或捕捉的方案: 捕捉并处理知道如何处理的异常 抛出不知道如何处理的异常

  4. throw 和 throws区别| throw:是语句,用于抛出异常对象。 throws:是关键字:关键字可以在方法上声明该方法要抛出的异常。

    \