出于命名空间的原因,我想在类Foo
内定义一个BarException
。这是我的Foo
课的样子:
package org.company.utils
class Foo {
class BarException extends RuntimeException { }
def raise() {
def r = new RuntimeException("BOOM")
throw new BarException(r)
}
}
这就是我希望它的工作方式:
void testFoo() {
shouldFail(Foo.BarException) {
def foo = new Foo()
foo.raise()
}
}
但测试失败,并显示:
1)测试Foo(测试。FooTestCase)java.lang.AssertionError: Closure 测试。FooTestCase$_testFoo_closure1@3eb25e1a 应该失败了,并带有 类型为 org.company.utils.Foo$BarException 的异常,而是得到 异常 groovy.lang.GroovyRuntimeException: 找不到匹配项 构造函数: org.company.utils.Foo$BarException(org.company.utils.Foo, java.lang.RuntimeException)
我尝试使用new BarException(this, r)
实例化BarException,并将groovy.transform.InheritConstructors
放在BarException
周围,但对编译器没有任何用处。
怎么了?
尝试将 BarException 设为静态并添加 @InheritConstructors
。
import groovy.transform.InheritConstructors
class Foo {
@InheritConstructors
static class BarException extends Exception { }
def raise() {
Throwable r = new RuntimeException("BOOM")
throw new BarException(r)
}
}
来自时髦的文档:
静态内部类的使用是最好的支持。如果你 绝对需要一个内部类,你应该把它变成一个静态的。