Java异常处理全解析
立即解锁
发布时间: 2025-08-18 02:26:22 阅读量: 1 订阅数: 18 

### Java异常处理全解析
#### 1. 异常概述
在Java中,除了`RuntimeException`的子类外,Java类库中方法抛出的所有异常都是受检查异常。当代码可能抛出除`Error`或`RuntimeException`类型之外的异常时,必须对其进行处理。处理异常主要有两种方式:一是在方法中提供代码来处理抛出的异常;二是让包含可能抛出异常代码的方法将异常传递给调用该方法的代码。
#### 2. 指定方法可能抛出的异常
若方法可能抛出既不是`RuntimeException`子类也不是`Error`子类的异常,如`IOException`,当方法涉及文件输入或输出操作时就可能抛出该异常。若在方法中未捕获并处理该异常,则必须在方法签名中声明该异常可能被抛出。具体做法是在方法参数列表后添加`throws`子句,然后列出可能抛出的异常类,用逗号分隔。示例如下:
```java
double myMethod() throws IOException, FileNotFoundException {
// 方法代码细节...
}
```
若另一个方法调用此方法,它也必须考虑该方法可能抛出的异常。调用方法的定义要么处理这些异常,要么声明它也可能抛出这些异常。
#### 3. 异常处理
可以在方法中包含三种代码块来处理受检查异常,分别是`try`、`catch`和`finally`块。
- **`try`块**:用于包含可能抛出一个或多个异常的代码。若想捕获异常,可能导致异常抛出的代码必须放在`try`块中。`try`块的结构如下:
```java
try {
// 可能抛出一个或多个异常的代码
}
```
即使是想捕获`Error`或`RuntimeException`类型的异常,`try`块也是必需的。
- **`catch`块**:用于处理特定类型的异常,必须紧跟包含可能抛出该异常代码的`try`块。`catch`块由`catch`关键字、括号内的单个参数(用于标识要处理的异常类型)和括号内的异常处理代码组成。示例如下:
```java
try {
// 可能抛出一个或多个异常的代码
} catch(IOException e) {
// 处理异常的代码
}
```
此`catch`块处理`IOException`类型或其任何子类的异常。若有其他未在方法签名中声明的受检查异常可能被抛出,代码将无法编译。
#### 4. `try`和`catch`块的使用示例
以下是一个使用`try`和`catch`块的示例,该示例抛出一个未受检查的异常:
```java
public class TestTryCatch {
public static void main(String[] args) {
int i = 1;
int j = 0;
try {
System.out.println("Try block entered " + "i = " + i + " j = " + j);
System.out.println(i/j); // 除以0 - 抛出异常
System.out.println("Ending try block");
} catch(ArithmeticException e) { // 捕获异常
System.out.println("Arithmetic exception caught");
}
System.out.println("After try block");
}
}
```
运行该示例,输出如下:
```
Try block entered i = 1 j = 0
Arithmetic exception caught
After try block
```
当`j`初始化为0时,`try`块中的除法操作会导致`ArithmeticException`异常被抛出。异常抛出后,控制权立即转移到`catch`块的第一条语句。若将`j`的值改为1,输出如下:
```
Try block entered i = 1 j = 1
1
Ending try block
After try block
```
此时整个`try`块会被执行,由于没有抛出算术异常,`catch`块中的代码不会被执行。
#### 5. `try`和`catch`块的绑定关系
`try`和`catch`块是绑定在一起的,不能在两者之间插入语句,也不能在`try`关键字和`try`块本身周围添加括号。若循环块也是`try`块,后续的`catch`块也是循环的一部分。示例如下:
```java
public class TestLoopTryCatch {
public static void main(String[] args) {
int i = 12;
for(int j = 3; j >= -1; --j) {
try {
System.out.println("Try block entered i = " + i + " j = " + j);
System.out.println(i/j); // 除以0 - 抛出异常
System.out.println("Ending try block");
} catch(ArithmeticException e) { // 捕获异常
System.out.println("Arithmetic exception caught: " + e);
}
```
0
0
复制全文
相关推荐








