Groovy怎么throw Exception?

文章导读
Previous Quiz Next 如果一个方法不处理 checked exception,则该方法必须使用 throws 关键字声明它。throws 关键字出现在方法签名的末尾。
📋 目录
  1. 语法
  2. 示例 - Throws 和 Throw 关键字的使用
  3. 示例 - 在无效参数时抛出异常
  4. 示例 - 在 main 和其他方法中使用 throws 和 throw
A A

Groovy - 抛出异常



Previous
Quiz
Next

如果一个方法不处理 checked exception,则该方法必须使用 throws 关键字声明它。throws 关键字出现在方法签名的末尾。

你可以使用 throw 关键字抛出异常,可以是新实例化的异常,也可以是你刚刚捕获的异常。

试着理解 throwsthrow 关键字之间的区别,throws 用于推迟处理 checked exception,而 throw 用于显式抛出异常。

语法

以下是使用 throwsthrow 抛出异常的语法 −

method(parameters) throws exception {
  // 方法实现
  throw new exception();
}

以下方法声明它抛出 RemoteException −

考虑下面的示例代码来使用 throwsthrow 关键字 −

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)

示例 - 在无效参数时抛出异常

以下示例展示了在传递无效参数时使用 throwthrows 关键字来发送异常并处理异常。我们调用一个 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

以下示例展示了在传递无效参数且异常未被处理的情况下使用 throwthrows 关键字来发送异常。我们调用一个 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)