# 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`类又是`Throwable`的子类。 正如我们所知道的，Java 中所有对象均来自`Throwable`对象类，也来自`Object`类。 异常和错误是从`Throwable`派生的两个不同的类。 错误代表的情况不是由于编程错误而发生，而是可能在程序执行时发生，这些都是 Java 程序无法处理且不应费心处理的异常行为。 JVM 内存不足是一种错误，可能在运行时发生。

## 受检与非受检异常

### 受检异常

1.  **受检异常**是`Exception`的子类，但`RuntimeException`及其子类除外。
2.  受检异常强制程序员处理可能引发的异常。
3.  当方法中发生受检异常时，该方法必须捕获异常并采取适当的措施，或者将异常传递给其调用方。

#### 示例

`IOException`异常。

### 非受检异常

1.  **非受检异常**是`RuntimeException`及其任何*子类*。
2.  编译器不会强制程序员捕获非受检异常或在`throws`子句中声明它。
3.  程序员甚至可能不知道会引发异常。
4.  受检异常必须在编译时捕获。
5.  运行时异常不是必需的。

#### 示例

`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`类来创建自定义异常。
*   `Catch`块应以最特殊到最一般的形式排序。 否则，编译器将报错无法访问的代码。

<https://www.youtube.com/embed/bpHcP14Onp4?start=1&amp;feature=oembed>

<https://www.youtube.com/embed/bYY6SWnMpz4?start=1&amp;feature=oembed>

