1

インポートjava.util.ArraysでArrays.copyOfを使用して配列のサイズを調整しようとしていますが、何らかの理由で、値を割り当てようとしたときに配列の長さが4であるとコンソールが出力しているにもかかわらず、配列の行番号4内のすべてに、行番号4の値を割り当てようとする行でnullPointerExceptionが発生します。誰かがこれを説明できますか?

import java.util.Arrays;
import static java.lang.System.out;

public class Main {
    static int TTT[][] = new int[3][3];

    public static void main(String[] args) {
        TTT = Arrays.copyOf(TTT, 4);
        out.print(TTT.length);
        TTT[3][0] = 2;
    }
}

これにより、次の出力が得られます。

4Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:13)

なぜこれが起こるのか誰かが知っていますか?また、サイドノートとして、サイズを変更できる配列を作成するためのより良い方法はありますか?もしそうなら、サンプルコードを教えてください!

4

1 に答える 1

2

ドキュメントから:

指定された配列をコピーし、(必要に応じて)nullで切り捨てまたはパディングして、コピーが指定された長さになるようにします。コピーでは有効であるが元のインデックスではないインデックスの場合、コピーにはnullが含まれます。このようなインデックスは、指定された長さが元の配列の長さよりも大きい場合にのみ存在します。結果の配列は、元の配列とまったく同じクラスになります。

何が起こるかというと、配列サイズが大きくなるため、の新しい参照がそのint[3]位置に作成され、ドキュメントに記載されているようにTTT[3]初期化されます。null配列がプリミティブ型であるという事実は、それ自体が内部配列を初期化する必要があるという意味ではありません。

試してみてください:

TTT = Arrays.copyOf(TTT, 4);
TTT[3] = new int[3];
于 2012-07-09T23:50:35.780 に答える