0

そのため、コードが一晩中機能しない理由を考えていましたが、何年にもわたって検索を行った後、ここに投稿することにしました. 次のような回線で NPE を受信して​​います。

this.numbers[a][b] = new Integer(n[a][b]);

これが私の完全なコードです:

private int[][] numbers, temp, temp2;
private int a, b;

public Matrix(int[][] n)
{
System.out.println(n[0].length);
int numbers[][] = new int[n[0].length][n[1].length];
int temp[][] = new int[n[0].length-1][n[1].length-1];
int temp2[][] = new int[n[0].length][n[1].length];
    for(a=0;a<n[0].length;a++)
        for(b=0;b<n[1].length;b++)
        {
            this.numbers[a][b] = new Integer(n[a][b]);
            this.temp2[a][b] = new Integer(n[a][b]);
        }
    this.xLength = n[0].length;
    this.yLength = n[1].length;
}

エラーが発生する理由がわかりません。私はそれが単純な間違いだと確信していますが。助けていただければ幸いです。(n[][] は完全に細かい配列です)

4

2 に答える 2

2

numbers は、クラス内ではなく、メソッド内で定義された配列であるため、 this.numbers は、定義したローカル数値配列ではなく、クラス内で定義した配列 (確かに値が null である) を参照します。あなたの方法で。

于 2012-12-26T03:15:49.093 に答える
0

すぐに気づいたこと: コンストラクターで、3 つのインスタンス変数numberstemp、および をマスクしていますtemp2。その必要はありません。

これらの各変数から型宣言と角括弧を削除すると、NPE は続行されません。これは主に is が原因で発生してnumbersおりnull、null に逆参照/インデックス付けすることはできません。

にもほとんど意味がありませんnew Integer(n[a][b]);n[i]andの型numbers[j][k]int[](つまり、プリミティブint) の場合、オートボクシングを行う必要はありません。値を直接割り当てるだけです。

ループ変数 ( a, )は、期待どおりに機能する前にそれらの前にb置く必要があります。そうしないと、宣言されません。int

最後に、間違った次元をループしています。長さが異なる 2 次元配列をループする場合n.lengthは、外側のループに for を使用し、内側のループに forを使用しn[0].lengthます。したがって、次のようになります。

 for (int a = 0; a < n.length; a++) {
    for (int b = 0; b < n[0].length; b++) {
        numbers[a][b] = new Integer(n[a][b]);
        temp2[a][b] = new Integer(n[a][b]);
    }
}
于 2012-12-26T03:24:04.413 に答える