#### **一、常见运行时异常**
1. **数组越界异常(ArrayIndexOutOfBoundsException)**
- **原因**:访问数组时索引超出有效范围(如数组长度为5,但访问索引5)。
- **解决**:在访问前检查索引是否满足 `0 <= index < array.length`。
- 示例:
```java
int[] arr = new int[3];
for (int i = 0; i <= arr.length; i++) { // 错误:i最大应为2
System.out.println(arr[i]);
}
```
2. **数学逻辑异常(ArithmeticException)**
- **原因**:除数为0。
- **解决**:在除法运算前检查除数是否为0,或用`try-catch`捕获。
- 示例:
```java
int a = 10, b = 0;
if (b != 0) {
System.out.println(a / b);
} else {
System.out.println("除数不能为0");
}
```
3. **空指针异常(NullPointerException)**
- **原因**:调用未初始化对象的方法或属性。
- **解决**:使用对象前判空。
- 示例:
```java
String str = null;
if (str != null) {
System.out.println(str.length());
}
```
---
#### **二、编译时异常(Checked Exceptions)**
1. **字符串解析异常(如ParseException)**
- **原因**:字符串格式与目标类型不匹配(如日期格式错误)。
- **解决**:确保格式一致,并用`try-catch`处理。
- 示例:
```java
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse("2024/07/09"); // 格式错误,应为2024-07-09
} catch (ParseException e) {
e.printStackTrace();
}
```
2. **文件操作异常(如IOException)**
- **原因**:文件路径错误或权限不足。
- **解决**:使用`try-catch`或在方法签名中用`throws`声明。
- 示例:
```java
public void readFile() throws IOException {
FileReader fr = new FileReader("test.txt");
}
```
---
#### **三、异常处理机制**
1. **抛出异常(Throws)**
- **定义**:将异常传递给上层调用者,不直接处理。
- **适用场景**:当前方法无法解决异常时。
- 示例:
```java
public void methodA() throws IOException {
methodB();
}
```
2. **捕获处理(Try-Catch)**
- **定义**:在当前方法内捕获并处理异常。
- **适用场景**:可在当前方法内解决异常时。
- 示例:
```java
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("除数为0");
}
```
---
#### **四、常见问题**
1. **为什么`catch`块未执行?**
- 可能未触发对应异常,或异常被上层捕获。
- 检查代码逻辑,确保异常类型匹配。
2. **空指针与空对象的区别**
- **空指针**:`String str = null`,未指向任何对象,调用方法会抛异常。
- **空对象**:`String str = ""`,对象存在且长度为0,调用`length()`返回0。
3. **多异常处理**
- 使用多个`catch`块或捕获父类异常(如`Exception`)。
- 示例:
```java
try {
// 可能抛出多个异常的代码
} catch (IOException e) {
// 处理IO异常
} catch (ParseException e) {
// 处理解析异常
}
```
---
#### **五、总结**
- **运行时异常**:需通过代码逻辑避免(如判空、检查索引/除数)。
- **编译时异常**:必须显式处理(`try-catch`或`throws`)。
- **原则**:能处理的异常尽量在底层解决,避免过多向上层传递。