Groovy catch语句奇怪的行为

时间:2014-07-23 14:55:21

标签: exception groovy

我有以下2个groovy片段应该做同样但但他们不会。

try {
  throw new RuntimeException()
} catch (IllegalStateException) {
  println("hello!")
}

'hello!'

的输出
try {
  throw new RuntimeException()
} catch (IllegalStateException e) {
  println("hello!")
}

此输出是一个意外的例外:

Caught: java.lang.RuntimeException
java.lang.RuntimeException
    at 2.run(2.groovy:2)

请注意唯一的区别是,在一个代码段中,catch块中没有e参数。

我正在运行以下版本的groovy和JVM。

groovy --version Groovy Version: 2.0.5 JVM: 1.6.0_37 Vendor: Sun Microsystems Inc. OS: Linux

这是预期的行为还是编译器中的错误? 感谢

2 个答案:

答案 0 :(得分:11)

在第一种情况下,您引入了名为IllegalStateException变量。它相当于:

try {
  throw new RuntimeException()
} catch (Exception IllegalStateException) {
  println("hello!")
}

在第二种情况下,你捕获IllegalStateException,这不是抛出异常的类型,因此catch块不会捕获它

等同于C#的意思,你只是想说你只想抓住IllegalStateException,但你不需要变量就可以了。关心异常对象。

请参阅Groovy style and language feature guidelines for Java developers文档中的“捕获任何异常”部分。

答案 1 :(得分:0)

在第二种情况下,您没有捕获抛出的异常;所以行为是预期的。在第一种情况下,'异常'是分配给抛出的异常的变量。打印出来,你就会看到它" java.lang.RuntimeException"。