异常分类
在 Java 里,异常类都继承自 `Throwable` 类,`Throwable` 有两个重要的子类:`Error` 和 `Exception`。
- **Error**:代表系统级的错误,一般是由 JVM 自身产生的,程序无法处理,例如 `OutOfMemoryError`、`StackOverflowError` 等。
- **Exception**:代表程序可以处理的异常,它又可分为受检查异常(Checked Exception)和运行时异常(Runtime Exception)。
- **受检查异常**:在编译时就必须进行处理,否则无法通过编译,像 `IOException`、`SQLException` 等。
- **运行时异常**:在编译时不需要强制处理,通常是由程序逻辑错误导致的,例如 `NullPointerException`、`ArrayIndexOutOfBoundsException` 等。
异常处理语句
Java 提供了 `try`、`catch`、`finally` 和 `throw`、`throws` 等关键字来处理异常。
1. `try-catch` 语句
`try` 块中放置可能会抛出异常的代码,`catch` 块用于捕获并处理异常。示例如下:
java
public class TryCatchExample {
public static void main(String[] args) {
try {
int[] arr = {1, 2, 3};
// 会抛出 ArrayIndexOutOfBoundsException 异常
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("捕获到数组越界异常: " + e.getMessage());
}
}
}
2. `try-catch-finally` 语句
`finally` 块中的代码无论是否发生异常都会被执行,一般用于释放资源。示例如下:
java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TryCatchFinallyExample {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("test.txt");
// 读取文件操作
} catch (FileNotFoundException e) {
System.out.println("文件未找到: " + e.getMessage());
} catch (IOException e) {
System.out.println("读取文件时发生 I/O 异常: " + e.getMessage());
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
System.out.println("关闭文件时发生异常: " + e.getMessage());
}
}
}
}
}
3. `throws` 关键字
`throws` 关键字用于方法声明,表明该方法可能会抛出某些异常,将异常处理的责任交给调用者。示例如下:
java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ThrowsExample {
public static void readFile() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("test.txt");
}
public static void main(String[] args) {
try {
readFile();
} catch (FileNotFoundException e) {
System.out.println("文件未找到: " + e.getMessage());
}
}
}
4. `throw` 关键字
`throw` 关键字用于手动抛出一个异常对象。示例如下:
java
public class ThrowExample {
public static void checkAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
System.out.println("年龄合法: " + age);
}
public static void main(String[] args) {
try {
checkAge(-5);
} catch (IllegalArgumentException e) {
System.out.println("捕获到异常: " + e.getMessage());
}
}
}
自定义异常
你可以通过继承 `Exception` 或 `RuntimeException` 类来创建自定义异常。示例如下:
java
// 自定义异常类
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
// 使用自定义异常
public class CustomExceptionExample {
public static void doSomething(int num) throws MyException {
if (num < 0) {
throw new MyException("输入的数字不能为负数");
}
System.out.println("输入的数字合法: " + num);
}
public static void main(String[] args) {
try {
doSomething(-5);
} catch (MyException e) {
System.out.println("捕获到自定义异常: " + e.getMessage());
}
}
}
总结
- 运用 `try-catch` 语句捕获并处理异常。
- 借助 `finally` 块确保资源被释放。
- 使用 `throws` 关键字将异常处理的责任交给调用者。
- 利用 `throw` 关键字手动抛出异常。
- 可通过继承 `Exception` 或 `RuntimeException` 类创建自定义异常。