2

如何将“抛出”添加到匿名内部类的构造函数?

class Foo {
  public Foo() throws Exception {
  }
}

因为这不起作用

 public static void main(String[] args) {
   Foo x = new Foo() {
     @Override
     public Foo() throws Exception {
     }
   }
 }

我试图弄清楚在哪里放置“抛出”以抑制编译器警告。有没有办法在不使用 try/catch 块或创建单独的类的情况下做到这一点?

4

4 回答 4

4

我不确定您要完成什么。请注意,匿名类永远不会有显式声明的构造函数。这是完全可以理解的,因为如果它有一个,它就需要有一个名字,因此不再是匿名的。

如果你想拥有一个构造函数可能抛出的类的匿名子类,这不是问题。

class Foo {
    Foo() throws Exception {
    }
}

void demo() throws Exception {
    Foo foo = new Foo() {  // might throw
    };
}

同样,如果你想用可能抛出的东西来初始化匿名类,你也可以这样做。请记住,匿名类的定义是表达式,因此只要它们被try-catch块包围或包含方法声明要抛出的异常,它们就可以抛出。

class Foo {
}

class Bar {
    Bar() throws Exception {
    }
}

void demo() throws Exception {
    Foo foo = new Foo() {
        Bar bar = new Bar();  // might throw
    };
}
于 2014-12-07T02:15:53.620 回答
1

您不能在匿名类上声明构造函数。

来自 Java 语言规范,第 15.9.5.1 节,“匿名构造函数”:匿名类不能有显式声明的构造函数。

如果您需要一个新的构造函数,请将该类设为内部类(但不是匿名的),甚至是顶级类。

于 2014-12-07T02:09:23.777 回答
0

如果您确实需要强制匿名类实例的一致性,您可以在工厂方法中创建它们,如果参数无效,该方法将引发异常。这仅适用于接口的匿名实例,因为匿名类不能是方法的返回类型。

一个完全没有意义的例子:

public class AnonymousException {

    public static void main(String args) {
        newRunnable(42).run();
    }

    private static Runnable newRunnable(final int x) {
        if(x < 0) throw new IllegalArgumentException();
        return new Runnable() {
            @Override
            public void run() {
                System.out.println("x=" + x);
            }
        };
    }
}
于 2014-12-07T02:18:14.893 回答
0

我试图弄清楚在哪里放置“抛出”以抑制编译器警告。

没有办法用throws. 匿名的语法不允许您throws在(隐式)构造函数上放置子句。(隐式)构造函数隐式抛出您正在使用的所有超类构造函数。(这取决于参数的数量和类型......)

另外:即使它确实做到了,一个throws子句也不会抑制我怀疑你得到的编译错误。从根本上说,超类构造函数声明它可能抛出Exception并添加一个throws无法改变的事实......没有某种方法来处理超类构造函数异常。

有没有办法在不使用 try/catch 块或创建单独的类的情况下做到这一点?

不,没有。

而且我怀疑您尝试做的事情甚至不可能使用常规的超类/子类。例如:

public class Foo {
    public Foo(int i) throws Exception { }
}

public class Bar extends Foo {
    public Bar(int i) {
        super(i);
    }
}

无法编译它,因为Bar构造函数无法抑制或处理Foo构造函数声明它抛出的异常。

(这是有充分理由的。如果Foo(42)确实抛出了异常,那么当异常到达Bar构造函数时,它将不得不处理部分构造 Foo的状态。这是不切实际的,即使是这样,它也会是一个坏主意。)

于 2014-12-07T02:54:40.443 回答