-2

宣言:

private Man[] man;  

これは初期化です:

Man[] man = new Man[1];

    for (int i = 0; i < 1; i++){
        man[i] = new Man();
            for (int j = 0; j < 3; j++){
                man[i].eatThis(table.foods[table.topFood-1]);
                table.topFood--;
            }
    }

これを印刷したい:

System.out.println(getMan(0));

これは次のようになります:

public Man getMan(int k){
 return man[k];
}

しかし、NullPointerException を受け取ります。なんで?その間:

System.out.println(man[0]);

うまく動作します。

戻り値:

Man = (bread, meat, cheese)

例外は次のとおりです。

Exception in thread "main" java.lang.NullPointerException
at ManRunning.getMan(ManRunning.java:80)
at ManRunning.newGame(ManRunning.java:133)
at ManRunning.<init>(ManRunning.java:57)
at RunDevilRun.main(RunDevilRun.java:9)
4

1 に答える 1

3

実際にローカル変数でクラスメンバーをシャドウイングしているようです。初期化時manman

Man[] man = new Man[1];

これにより、新しい変数が宣言されます。クラスメンバーと同じ名前のローカル変数が許可され、クラスレベル変数を非表示(別名シャドウ)します。したがって、初期化しているように見えmanますが、実際にはローカル配列を初期化しており、クラス内の配列には触れていません。それを初期化するだけで、新しいものを宣言しないようにするには、次のように言います。

man = new Man[1];
于 2013-03-03T03:48:38.503 に答える