由于找不到构造函数,无法实例化嵌套异常类

时间:2017-10-10 21:57:04

标签: groovy

我想在命名空间原因中定义类BarException内的Foo。这就是我的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)testFoo(test.FooTestCase)java.lang.AssertionError:Closure   test.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周围,但对编译器没有任何作用。

有什么问题?

1 个答案:

答案 0 :(得分:0)

尝试将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)
    }
}

来自groovy docs

  

静态内部类的使用是最受支持的。如果你   绝对需要一个内部类,你应该把它变成一个静态类。