8

私は初心者向けの Java ブックに従っています。プロジェクトの 1 つは、一般的にスローされるエラーからエラーを選択し、エラーを引き起こすためにできることを試みることです。

私は InstantiationError を選びましたが、抽象クラスまたはインターフェイスをインスタンス化できないことを知っているレベルに達しています。ドキュメントによると、エラーは通常コンパイラによってキャッチされますが、クラスの定義が互換性なく変更された場合、実行時にスローされる可能性があります。

プログラムの実行中にクラス定義を変更する方法がわかりません。さらにどこを読むべきかについてのヒントを探しています。ありがとう!

4

4 に答える 4

8

プログラムの実行中にクラス定義を変更する方法がわかりません

実行中は変更できませんが、コンパイル後に変更できます。

たとえば、これを試してください:

// In Test.java
public class Test {
    public static void main(String[] args){
        System.out.println(new Foo());
    }
}

// In Foo.java
public class Foo {
}

コンパイル:

javac Foo.java Test.java

走る:

java Test

// Some output like this...
Foo@1d6535bf

Foo.java次のように変更します。

// No parameterless constructor any more!
public class Foo {
    public Foo(int x) {
    }
}

再コンパイルするだけ Foo.javaです:

javac Foo.java

テストを再実行します。

Exception in thread "main" java.lang.NoSuchMethodError: Foo: method <init>()V 
    not found
    at Test.main(Test.java:3)

ただし、これは「一般的にスローされるエラー」とは言えません。

そうではないことに注意してくださいInstantiationError- ただし、次のように変更できますFoo.java

public interface Foo {
}

繰り返しますが、再コンパイルするFoo.javaと、今度は次のようになります。

Exception in thread "main" java.lang.InstantiationError: Foo
        at Test.main(Test.java:3)
于 2013-02-12T19:52:32.367 に答える
6

おそらく、リフレクションを使用して実行時に抽象クラスをインスタンス化するときです。

コードサンプル:

public abstract class MyAbstractClass{
}

public class MyMainClass() {
    public void test(String[] args) {
             this.getClass().getClassLoader().loadClass("MyAbstractClass").getConstructors()[0].newInstance();
    }
}
于 2013-02-12T19:49:46.407 に答える
1

このタイプのエラーの原因となる単純なことは、間違った数のパラメーターでオブジェクトを作成しようとした場合です。コンストラクターが 2 つのパラメーターを受け取るとしますが、ユーザーが 3 つ以上のパラメーターを入力できるようにインターフェイスが設計されています。通常、パラメーターの数はコンパイラーによってキャッチされますが、「オンザフライ」で作成された場合、実行時にキャッチされます。

于 2013-02-12T20:09:42.467 に答える
1

クラスを名前でインスタンス化する方法を提供するReflection APIをご覧ください。

public void throwError() {
    AbstractType type = this.getClassLoader().newInstance("my.abstract.Type");
} 
于 2013-02-12T19:49:58.180 に答える