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 に答える