# Java 异常教程 > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-exceptions/](https://javabeginnerstutorial.com/core-java-tutorial/java-exceptions/) Java 中的异常用于处理错误或程序正常流程中发生的任何其他异常事件。 在 Java 中可以通过多种方式发生异常。 * 提供的数据不是预期的格式(例如 int 而不是 String)。 * 无法连接数据库。 * 网络连接丢失。 * 对象为空。 * ….. ## Java 异常层次结构 Java 中的每个 Exception 都是 Exception 类的子类型,而 Exception 类又是 Throwable 的子类。 正如我们所知道的,Java 中所有对象均来自 Throwable 对象类,也来自 Object 类。 异常和错误是从 Throwable 派生的两个不同的类。 错误代表的情况不是由于编程错误而发生,而是可能在程序执行时发生,这些都是 Java 程序无法处理且不应费心处理的异常行为。 JVM 内存不足是一种错误,可能在运行时发生。 ## 已检查与未检查异常 ### 受检异常 1. ***受检异常***是`Exception`的子类,但`RuntimeException`及其子类除外。 2. 受检异常强制程序员处理可能引发的异常。 3. 当方法中发生受检异常时,该方法必须捕获异常并采取适当的措施,或者将异常传递给其调用方。 #### 例 IO 异常。 ### 非受检异常 1. ***非受检异常***是`RuntimeException`及其任何*子类*。 2. 编译器不会强制程序员捕获非受检异常或在`throws`子句中声明它。 3. 程序员甚至可能不知道会引发异常。 4. 受检异常必须在编译时捕获。 5. 运行时异常不是必需的。 #### Example ArrayIndexOutOfBounds 异常。 ## Java 异常处理 现在我们知道 Java 程序可以在任何时间(或任何位置)发生异常。 因此,我们需要知道如何处理这些异常。 处理异常是开发健壮的应用时必需的属性。 处理异常意味着在发生异常时将程序的执行转移到适当的处理程序。 我们可以使用 try-catch 块来处理异常。 **`try`**:`try`用于定义可能发生异常的代码块。 **`catch`**:`catch`用于匹配特定类型的异常。 一个 try 块可能有多个 catch 子句。 **`finally`**:`finally`确定将在 try 块之后始终执行的代码块。 即使在例外的情况下。 ```java try { throw new IOException(); } catch (IOException e) { // Handle only IO Exception // This block will get executed only in case of IOException }catch (Exception e) { // Handle only all other type of exception // This block will get executed in case of all exception except IOException }finally{ System.out.println("This block will get executed no matter exception occur or not"); } ``` 注意*:try 子句不能没有 catch 或 finally 块而站立。 它们都是必需的。 ### 异常传播 不需要处理 catch 块中 try 块引发的所有异常(因为它不是必需的块)。 如果 catch 块无法处理 try 块引发的异常,它将传播到调用此方法的方法中。 如果先前调用此方法的方法也无法处理该异常,则该异常将传播到方法堆栈中的最后一个方法,除非某些方法处理该异常,否则它将以相同的方式传播。 如果没有方法在调用堆栈中处理它,则异常将触底,而 JVM 将对其进行处理。 (感谢 Mohita 的建议) ## 备忘单 * ***受检***和***非受检异常***是两种类型的异常。 * 受检异常是那些`Exception`类的子类型,但不包括扩展***运行时异常***的类。 * ***错误***和***运行时异常***的子类型属于非受检异常。 * `finally`块将始终在所有条件下调用。 * System.exit()是无法阻止 finally 块执行的唯一方法,在这种情况下,JVM 将关闭。 * 还可以通过扩展 Exception 类来创建自定义异常。 * 渔获物的订购应以最特殊的形式订购。 否则,编译器将抱怨无法访问的代码。