Groovy - 抛出异常
如果一个方法不处理 checked exception,则该方法必须使用 throws 关键字声明它。throws 关键字出现在方法签名的末尾。
你可以使用 throw 关键字抛出异常,可以是新实例化的异常,也可以是你刚刚捕获的异常。
试着理解 throws 和 throw 关键字之间的区别,throws 用于推迟处理 checked exception,而 throw 用于显式抛出异常。
语法
以下是使用 throws 和 throw 抛出异常的语法 −
method(parameters) throws exception {
// 方法实现
throw new exception();
}
以下方法声明它抛出 RemoteException −
考虑下面的示例代码来使用 throws 和 throw 关键字 −
class Example {
void deposit(double amount) throws RemoteException {
// 方法实现
throw new RemoteException();
}
// 类的其余定义
}
一个方法可以声明抛出多个异常,在这种情况下,异常通过逗号分隔的列表声明。例如,以下方法声明它抛出 RemoteException 和 InsufficientFundsException −
class className {
void withdraw(double amount) throws RemoteException,
InsufficientFundsException {
// 方法实现
}
// 类的其余定义
}
示例 - Throws 和 Throw 关键字的使用
以下示例展示了在传递无效参数的情况下使用 throw 关键字发送异常。我们调用一个 divide 方法,该方法检查第二个参数是否为零,如果是,则抛出带有自定义消息的 IllegalArgumentException。由于 IllegalArgumentException 是一个 unchecked exception,divide 方法不需要声明 throws 语句。现在,由于父方法没有处理该异常,JVM 会拦截它,打印错误消息并终止程序。
Example.groovy
class Example {
static void main(String[] args) {
int a = 3;
int b = 0;
println("result:" + divide(a,b));
}
static int divide(int a, int b) {
if(b == 0) {
throw new IllegalArgumentException("第二个参数不能为零。");
}
return a / b;
}
}
输出
这将产生以下结果 −
Caught: java.lang.IllegalArgumentException: second argument cannot be zero. java.lang.IllegalArgumentException: second argument cannot be zero. at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) at Example.divide(main.groovy:11) at Example.main(main.groovy:6) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
示例 - 在无效参数时抛出异常
以下示例展示了在传递无效参数时使用 throw 和 throws 关键字来发送异常并处理异常。我们调用一个 divide 方法,该方法检查第二个参数是否为零,如果是,则抛出带有自定义消息的 Exception。由于 Exception 是一个 checked exception,divide 方法必须声明 throws 语句。现在,由于父方法要么处理异常,要么声明 throws 异常,我们选择处理异常并打印消息。
Example.groovy
class Example {
static void main(String[] args) {
int a = 3;
int b = 0;
try {
println("result:" + divide(a,b));
} catch (Exception e) {
println("Exception: " + e);
}
}
static int divide(int a, int b) throws Exception {
if(b == 0) {
throw new Exception("第二个参数不能为零。");
}
return a / b;
}
}
输出
这将产生以下结果−
Exception: java.lang.Exception: second argument cannot be zero.
示例 - 在 main 和其他方法中使用 throws 和 throw
以下示例展示了在传递无效参数且异常未被处理的情况下使用 throw 和 throws 关键字来发送异常。我们调用一个 divide 方法,该方法检查第二个参数是否为零,如果是,则抛出带有自定义消息的 Exception。由于 Exception 是一个 checked exception,divide 方法必须声明 throws 语句。现在,由于父方法要么处理异常,要么声明 throws 异常,我们选择声明抛出异常,由 JVM 处理异常。
Example.groovy
class Example {
static void main(String[] args) throws Exception {
int a = 3;
int b = 0;
println("result:" + divide(a,b));
}
static int divide(int a, int b) throws Exception {
if(b == 0) {
throw new Exception("第二个参数不能为零。");
}
return a / b;
}
}
输出
这将产生以下结果−
Caught: java.lang.Exception: second argument cannot be zero. java.lang.Exception: second argument cannot be zero. at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) at Example.divide(main.groovy:10) at Example.main(main.groovy:5) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)