如果一个方法没有处理一个已检查的异常,那么该方法必须使用 throws
关键字声明它。throws
关键字出现在方法签名的末尾。
你可以通过使用 throw
关键字来抛出一个异常,这可以是一个新实例化的异常或者是你刚刚捕获的一个异常。
尝试理解 throws
和 throw
关键字之间的区别,throws
用于推迟处理一个已检查的异常,而 throw
用于显式地引发一个异常。
throws
和 throw
的语法
以下是使用 throws
和 throw
抛出异常的语法:
method(parameters) throws exception {
throw new exception();
}
下面的方法声明它抛出了一个 RemoteException
:
import java.io.*;
public class className {
public void deposit(double amount) throws RemoteException {
throw new RemoteException();
}
}
一个方法可以声明抛出不止一个异常,在这种情况下,异常在用逗号分隔的列表中声明。例如,下面的方法声明它抛出一个 RemoteException
和一个 InsufficientFundsException
:
import java.io.*;
public class className {
public void withdraw(double amount) throws RemoteException, InsufficientFundsException {
}
}
Java throws
和 throw
示例
下面的示例展示了使用 throw
关键字在传递无效参数时发送异常。我们调用一个 divide
方法,该方法检查第二个参数是否为零,如果是,则抛出一个带有自定义消息的 IllegalArgumentException
。由于 IllegalArgumentException
是一个非检查异常,divide
方法不需要声明 throws
语句。现在由于父方法没有处理异常,JVM 拦截它并打印错误消息,然后终止程序。
package com.tutorialspoint;
public class ExcepTest {
public static void main(String args[]) {
int a = 3;
int b = 0;
System.out.println("结果:" + divide(a, b));
}
private static int divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("第二个参数不能为零。");
}
return a / b;
}
}
输出:
主线程异常:java.lang.IllegalArgumentException: 第二个参数不能为零。
at com.tutorialspoint.ExcepTest.divide(ExcepTest.java:13)
at com.tutorialspoint.ExcepTest.main(ExcepTest.java:8)
更多示例
示例 1:在无效参数上传递异常
下面的示例展示了使用 throw
和 throws
关键字在传递无效参数时发送异常并处理该异常。我们调用一个 divide
方法,该方法检查第二个参数是否为零,如果是,则抛出一个带有自定义消息的 Exception
。由于 Exception
是一个已检查的异常,divide
方法需要声明 throws
语句。现在,由于父方法要么处理异常要么声明抛出异常,我们将处理异常并打印消息。
package com.tutorialspoint;
public class ExcepTest {
public static void main(String args[]) {
int a = 3;
int b = 0;
try {
System.out.println("结果:" + divide(a, b));
} catch (Exception e) {
System.out.println("异常:" + e);
}
}
private static int divide(int a, int b) throws Exception {
if (b == 0) {
throw new Exception("第二个参数不能为零。");
}
return a / b;
}
}
输出:
异常:java.lang.Exception: 第二个参数不能为零。
示例 2:在主方法和其他方法中使用 throws
和 throw
下面的示例展示了在传递无效参数时使用 throw
和 throws
关键字发送异常,并且不处理异常。我们调用一个 divide
方法,该方法检查第二个参数是否为零,如果是,则抛出一个带有自定义消息的 Exception
。由于 Exception
是一个已检查的异常,divide
方法需要声明 throws
语句。现在,由于父方法要么处理异常要么声明抛出异常,我们声明抛出异常,JVM 将处理异常。
package com.tutorialspoint;
public class ExcepTest {
public static void main(String args[]) throws Exception {
int a = 3;
int b = 0;
System.out.println("结果:" + divide(a, b));
}
private static int divide(int a, int b) throws Exception {
if (b == 0) {
throw new Exception("第二个参数不能为零。");
}
return a / b;
}
}
输出:
主线程异常:java.lang.Exception: 第二个参数不能为零。
at com.tutorialspoint.ExcepTest.divide(ExcepTest.java:15)
at com.tutorialspoint.ExcepTest.main(ExcepTest.java:9)