在Java中,异常处理为我们提供了一套处理运行时错误的机制,以确保程序的流畅运行。在这个机制中,有两个非常容易混淆的关键字:throw 和 throws。虽然它们都用于处理异常,但使用方式却截然不同。让我们一起来深入了解一下它们的区别和用法。
Java 中的 throw
throw 关键字用于在方法或代码块内部显式地抛出一个异常。我们需要创建一个异常对象,然后使用 throw 来“抛出”它,从而向系统发出一个错误发生的信号。
- 用于手动抛出一个异常。
- 用于方法或代码块内部。
- 一次只能抛出一个异常对象。
- 抛出的对象必须是 Throwable 类型(即 Exception 或 Error)的实例。
// Java 示例
public class Main {
public static void main(String[] args)
{
// 使用非受检异常
try {
// double x=3/0;
throw new ArithmeticException();
}
catch (ArithmeticException e) {
e.printStackTrace();
}
}
}
输出:
> java.lang.ArithmeticException
> at Main.main(Main.java:7)
Java 中的 throws
throws 关键字用于方法声明中,用来指明该方法可能会抛出一个或多个受检异常。它相当于告诉方法的调用者:“请注意,你需要处理这里可能发生的异常”。
- 用于方法签名(声明)处。
- 用于声明方法可能抛出的异常类型。
- 可以声明多个异常,用逗号分隔。
- 主要用于受检异常(Checked Exceptions,例如 IOException)。
Java throws 示例
import java.io.*;
public class ThrowsExample {
static void readFile() throws IOException {
FileReader fr = new FileReader("test.txt");
System.out.println("File opened successfully");
}
public static void main(String[] args) {
try {
readFile();
} catch (IOException e) {
System.out.println("Exception Handled: " + e.getMessage());
}
}
}
输出:
> Exception Handled: test.txt (No such file or directory)
throw 与 throws 的对比
下面我们总结了 Java 中 throw 和 throws 的主要区别:
throws
—
它用于在方法签名中声明方法可能抛出的异常类型。
它用于方法声明(签名)处。
它主要用于声明受检异常。非受检异常通常不需要强制使用 throws。
异常的处理责任交给了方法的调用者。
它强制调用者必须处理声明的异常(要么捕获,要么继续向上抛出)。
例如:public void myMethod() throws IOException {}