2

ArrayList 属性を持つクラスと、そのクラスの 2D 配列を持つ別のクラスがあります。

public class someThingsList {

    private List<someThings> lst;

    public someThingsList () {
        this.lst = new ArrayList<someThings>();
    }
    public addThing(someThings) {
        someThings s = someThings;
        this.lst.add(s);
    }
}

public class x implements y {

    private static someThingsList[][] field;

    public x(int h, int w) {
    x.field = new someThingsList[h][w];
    for (someThingsList[] lst1 : x.field)
        for (someThingsList lst2 : lst1)
            lst2 = new someThingsList();
}

たとえば、h と w として (2,2) を持つ新しい x オブジェクトがあり、実行しようとすると

x.fields[0][0].addThing(thing);

NullPointerException エラーが発生しました。理由はわかりますか?

4

3 に答える 3

3

残念ながら、配列を変更したい場合、拡張された for-each ループを配列で使用することはできません。lst2あなたの例では(へのnull)別の参照であり、それを変更しても元の配列は変更されません。これを試して:

for(int i = 0; i < field.length; ++i)
    for(int j = 0; j < field[i].length; ++j)
        field[i][j] = new someThingsList();

または代わりに:

for(int i = 0; i < h; ++i)
    for(int j = 0; j < w; ++j)
        x.field[i][j] = new someThingsList();

実際のところ、この問題は配列に固有のものではありません。次のコードを確認してください。

List<String> strings = //...

for(String s: strings) {
    s += "Bar";
}

元のリストを変更しているように見えますが、各ループ後に再作成されて無視されるstrings一時s変数をほとんど変更していません。

于 2013-02-14T17:05:24.157 に答える
0

配列をインスタンス化しましたが、オブジェクトx.field = new someThingsList[h][w];をインスタンス化しませんでした。someThingsListしたがって、 x.field[i][j] は を与えNullPointerExceptionます。

for(int i = 0; i < x.field.length; i++)
    for(int j = 0; j < x.field[i].length; j++)
        x.field[i][j] = new someThingsList();
于 2013-02-14T17:05:22.843 に答える
0

コードの問題は、元の配列に影響を与えないように、ループのローカル変数である「lst2」の値をインスタンス化するループごとに 2 番目を反復する場合です。ループが lst2 の値を超えるとすぐに失われます。そのため、配列要素が null のままになり、null オブジェクトでメソッドを呼び出そうとすると、null ポインター例外が発生します。

これを理解するには、arr[0] を出力してみてください。オブジェクト型を出力してから、null を出力する a[0][0] を出力しようとします。

これにより、構文が機能しない理由が明確になることを願っています。

このコードを実行してみてください。ここで何が問題なのかがわかります。

import java.util.*;
class someThingsList {

    private List<String> lst;

    public someThingsList () {
        this.lst = new ArrayList<String>();
    }
    public void addThing(String someThings ) {
        String s = someThings;
        this.lst.add(s);
    }
}
class Main{

    private static someThingsList[][] field;

 public static void main (String[] args) throws java.lang.Exception
  {
    new Main(3,3);
System.out.println(Main.field[0]);
System.out.println(Main.field[0][0]);
    Main.field[0][0].addThing("thing");
  }

    public Main(int h, int w) {
    Main.field = new someThingsList[h][w];
    for (someThingsList[] lst1 : Main.field)
    {
    System.out.println(lst1);
        for (someThingsList lst2 : lst1){
System.out.println(lst2);
            lst2 = new someThingsList();
System.out.println(lst2);}
    }
    }
}
于 2013-02-14T17:38:00.660 に答える