**核心要点:**
1. **异常的作用**
- 通过`throw`抛出异常,作为方法内部的一种**特殊返回值**,通知上层调用者执行中的问题。
- 与`return`不同,`throw`直接中断当前流程,将异常逐层向上传递,直到被捕获或导致程序终止。
2. **异常传播**
- 异常需在**最上层方法**(如`main()`)或调用链的合适位置被捕获,通过`try-catch`块处理。
- 示例:
```java
public static void main(String[] args) {
try {
methodA();
} catch (Exception e) {
System.out.println("异常原因:" + e.getMessage());
}
}
```
3. **运行时异常(Unchecked Exceptions)**
- 如`NullPointerException`、`ArrayIndexOutOfBoundsException`等,属于`RuntimeException`子类。
- **特点**:
- 不强制在编译时处理,但若未捕获会导致程序崩溃。
- 可通过`try-catch`主动处理,提升健壮性。
- 示例:
```java
try {
int[] arr = new int[5];
System.out.println(arr[10]); // 触发异常
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界!");
}
```
4. **编译时异常(Checked Exceptions)**
- 如`IOException`,必须显式处理(`try-catch`或`throws`)。
- 示例:
```java
public void readFile() throws IOException {
FileReader file = new FileReader("test.txt"); // 必须处理IO异常
}
```
5. **异常捕获的注意事项**
- 若`try`块中未执行到可能抛出异常的代码,则`catch`块不会触发。
- 示例:
```java
try {
System.out.println("正常代码"); // 未触发异常
} catch (Exception e) {
System.out.println("不会执行");
}
```
6. **异常与代码错误的区别**
- **代码错误**(如缺少分号、拼写错误)属于**编译错误**,无法通过异常机制处理。
- **异常**是代码逻辑在运行时发生的问题(如文件不存在、网络中断)。
**总结:**
- 异常用于分离正常逻辑与错误处理,增强代码可读性和健壮性。
- **运行时异常**和**编译时异常**均可通过`try-catch`或`throws`处理,区别在于是否强制要求。
- 合理使用异常机制,避免程序因未处理异常而崩溃。