2
public class MyClassTest {

    private static MyClass m;

    public static void main(String[] args) {
        m.initMe(getint());
    }

    public static int getint() {
        m = new MyClass();
        return (int) Math.random()*100;
    }

}

class MyClass{

    int i;

    void initMe(int i) {
       this.i = i;
       System.out.println(this.i);
     }

}

このコード スニペットはNullPointerExceptioninitMe()が呼び出される前にgetintが呼び出されるようにします。この問題の根本原因は何でしょうか? JAVA は値渡しなので、参照の更新は影響を受けません。

その背後にある適切な理由を教えてください。

4

7 に答える 7

1

で指定されているように

JLS section 15.12. Method Invocation Expressions

メソッド呼び出し式は、クラスまたはインスタンス メソッドを呼び出すために使用されます。

MethodInvocation:
    MethodName ( ArgumentListopt )
    Primary . NonWildTypeArgumentsopt Identifier ( ArgumentListopt )
    super . NonWildTypeArgumentsopt Identifier ( ArgumentListopt )
    ClassName . super . NonWildTypeArgumentsopt Identifier ( ArgumentListopt )
    TypeName . NonWildTypeArguments Identifier ( ArgumentListopt )

The definition of ArgumentList from §15.9 is repeated here for convenience:


ArgumentList:
    Expression
    ArgumentList , Expression

コンパイル時のメソッド名の解決は、メソッドのオーバーロードの可能性があるため、フィールド名の解決よりも複雑です。実行時のメソッドの呼び出しは、インスタンス メソッドのオーバーライドの可能性があるため、フィールドへのアクセスよりも複雑です。

メソッド呼び出し式によって呼び出されるメソッドを決定するには、いくつかの手順が必要です。次の 3 つのセクションでは、メソッド呼び出しのコンパイル時の処理について説明します。メソッド呼び出し式のタイプの決定は、§15.12.3 で説明されています。

これで、呼び出されるメソッドが型の識別に関係していることがわかります。Java はメソッドのオーバーライドをサポートしているため、同じメソッドを実装するさまざまなタイプを使用できます。したがって、メソッドの引数を解決する前に、インスタンスタイプが識別されます。これは、あなたの場合は null であり、NPE になります。

それが役に立てば幸い。

于 2013-10-28T11:32:20.767 に答える
0

メソッドMyClass object内で作成していますgetint()

public static int getint() {
    m = new MyClass();
    return (int) Math.random()*100;
  }

メソッドMyClass object内で作成する必要があります main(String[] args)

public static void main(String[] args) {
   m = new MyClass();
   m.initMe(getint());
}
于 2013-10-28T11:14:26.847 に答える
0

main は、MyClass の initMe を呼び出す前に呼び出される最初のメソッドであり、m を初期化します。お気に入り

private static MyClass m = new MyClass();

m.initMe(getint());m で initMe() を呼び出しますが、これは main メソッドの最初の行であるため m を初期化していないため、m = null例外です。

于 2013-10-28T11:11:34.697 に答える
0

インスタンス化せずMyClassに、そのメソッドを呼び出しましたinitMe。したがって、オブジェクトがインスタンス化されていないため、この例外が発生します。これを次のように変更します。

 private static MyClass m = new MyClass();
于 2013-10-28T11:11:34.720 に答える