5

Java でのプログラミングは初めてで、自分のコードで何が起こっているのかわかりません。

それは私に言います:

Exception in thread "main" java.lang.NullPointerException
    at Main.Country.addMine(Country.java:37)
    at Main.Main.main(Main.java:21)
Java Result: 1

私の main.java は単純です:

    Continent Europe = new Continent("Europe");
    Country asd = new Country("asd", Europe);
    Mine mine = new Mine(100,100,100,100);
    System.out.println(mine == null);
    asd.addMine(mine); //dies here

これは addMine メソッドです:

public void addMine(Mine mine) {
     System.out.println(mine == null);
     this.mines.add(mine); //dies here
     this.iron += mine.iron;
     this.gold += mine.gold;
     this.stone += mine.stone;
     this.wood += mine.wood;
     System.out.println("Mine has been successfully added to the country with the given values."
);

Mine.java は次のとおりです。

public class Mine implements Building { //Building is an empty interface :)
    protected int iron;
    protected int gold;
    protected int stone;
    protected int wood;
    public Mine(int iron, int gold, int stone, int wood) {
        this.iron += iron;
        this.gold += gold;
        this.stone += stone;
        this.wood += wood;
    }
}

ご覧のとおり、私は 2 つの println-s を書きましたが、どちらも false だったので、オブジェクトが存在します! NullPointerException が表示される理由がわかりません:(

4

4 に答える 4

3

これが失敗した場合:

this.mines.add(mine); //dies here

...それなら私minesはnull参照だと思います。それや初期化の宣言は示していませんが、それが最初の呼び出しポートになるはずです。たぶん、それはただの変化の場合です:

private List<Mine> mines;

private List<Mine> mines = new ArrayList<Mine>();

または同様のもの。

于 2012-11-17T23:19:48.103 に答える
1

はい、そうでmineはありませんnullが、どうminesですか?それはそれかArrayList<Mine>そのようなものだと思いますが、あなたはそれを次のように初期化しましたmines = new ArrayList<Mine>()か?(またはそれがどちらのコレクションでも)

于 2012-11-17T23:20:24.467 に答える
1

null である参照でメソッドを呼び出すと、null ポインター例外がスローされます。

this.mines.add(mine); //dies here

this.mines参照は明らかに等しいnullです。

また、参照変数名を小文字で始めるようにしてください。

Continent Europe = new Continent("Europe");

->

Continent europe = new Continent("Europe");

大文字で始まる名前は、クラス用に「予約」されています。

Java では良いスタイルと見なされています。

于 2012-11-17T23:25:56.683 に答える
0

あなたのコードは失敗します

this.mines.add(mine);

カウンティクラスで。

エラーを回避するには、County クラス内にローカル変数を作成する必要があります (持っていない場合)。

private List<Mine> mines;

そして、次を追加して初期化します

mines=new LinkedList<Mine>();

上記のことは 1 行のコードで記述できますが、それはあなた次第です。

private List<Mine> mines=new LinkedList<Mine>(); 

List の他の実装を使用できます。

于 2012-11-17T23:41:32.277 に答える