Groovy中catch语句的奇怪行为

4

我有以下两个Groovy代码片段,它们应该做相同的事情,但实际上并不一样。

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

这是一条关于IT技术的翻译内容:“这个'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版本:2.0.5 JVM:1.6.0_37 供应商:Sun Microsystems Inc. OS:Linux 这是预期行为还是编译器中的错误? 谢谢。

加上分号终止符并没有产生任何影响。谢谢! - Mauro Ciancio
1
@Unihedron 在Groovy中,分号;是可选的。 - helpermethod
第二个代码片段中的异常是预期的。也许您想抛出 IllegalStateException 并捕获 RuntimeException - Peter Niederwieser
2个回答

11

在第一种情况下,你引入了一个名为IllegalStateException变量。这等同于:

在第一个案例中,您引入了一个名为IllegalStateException变量。它与以下代码等效:

try {
  throw new RuntimeException()
} catch (Exception IllegalStateException) {
  println("hello!")
}
在第二种情况下,你只捕获了 IllegalStateException 异常,这并不是被抛出的异常类型,所以 catch 块不能捕获它。
这与 C# 的含义不同,C# 中表示你只想要捕获 IllegalStateException 异常,但你不需要一个变量来存储它,因为你不关心该异常对象本身。
请参见Groovy 风格和语言特性指南中的“捕获任何异常”部分。

这与第一段代码片段相同。 - Peter Niederwieser
@PeterNiederwieser:是的,我刚确认过 :) - Jon Skeet
太棒了。现在有意义了。谢谢你的解释。 - Mauro Ciancio
最好使用catch (IllegalStateException | Exception e)来覆盖两种类型的异常。@MauroCiancio - dmahapatro
把我带到这里了。这样下去没有意义。我同意那将是不相关的。 - dmahapatro
显示剩余6条评论

0
在第二种情况下,您没有捕获抛出的异常;因此这种行为是可以预料的。在第一种情况下,“Exception”是分配给抛出的异常的变量。打印出来,你会看到它是“java.lang.RuntimeException”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接