0

私はこのコードを持っています、

class Test
{
    public static void main(String args[])
    {
        ArrayList<Integer> al=new ArrayList<>();
        al.add(1);
        al.add(2);
        al.add(3);
        Integer a[]=new Integer[2];
        al.toArray(a);
        for(int i:a)
        System.out.println(i);
        /*for(int i=0;i<a.length;i++)
        System.out.println(a[i]);*/

    }
}

上記のコードは NullPointerException をスローしますが、コメント部分を取り除こうとすると、コメントが拡張された for ループで null が 2 回出力されます。a.length を出力すると 2 が出力されます。整数配列サイズを 3 に設定すると、123 が出力されます。

私が間違っている場合は修正してください:

1> toArray(T[] a) メソッドの私の理解では、配列のサイズがリスト内の要素よりも小さい場合、配列によって指定されたサイズで新しい配列が作成され、その中の要素はnullになります。 . 私の配列は次のようになります a[]={null,null};

2> 拡張 for ループと従来の for ループの違いは、拡張 for ループでは個々の要素を変更または削除できないことです。

しかし、なぜこのプログラムではこれが違うのでしょうか? 私はそれらを印刷しているだけですが、ループがnullを印刷せず、NullPointerExceptionをスローしないのはなぜですか?

4

2 に答える 2

1

メソッドは変換された配列を返します。これtoArray(a)を使用する必要があります。十分な大きさがなかったため、配列を使用しませんでした。

あれは、

  1. リストのサイズが2(メソッドに提供した配列の長さと同じ)または
  2. 配列の長さが3(配列に変換したいリストのサイズと同じ)だった場合、

返された配列は必要ありません。そのため、forループは希望どおりに出力されます。

についてはNullPointerException、 からIntegerへの自動アンボックス化のためですint。つまり、次のコードは をスローしませんでしたNPE:

for(Integer i : a)
{
  System.out.println(i);
}

次のコードは(あなたの場合と同じように):

for(int i : a)
{
  System.out.println(i);
}

コンパイラが上記の強化された for ループでボックス化解除を行う理由について考えてみてください。配列の内容はboxed整数です。primitiveそれらをint 参照に割り当てようとします (配列内のすべての intと同じように読みます)。そのため、それを行う唯一の方法は、ボックス化されたオブジェクトのボックス化を解除することです。

for(int i : a)
{
  System.out.println(a[i]);
}

に変換します

for(int i = 0; i < a.length; i++)
{
  System.out.println((int) a[i]);  // a[i] is null here, so casting causing an NPE
}

より正確には、

for(int i = 0; i < a.length; i++)
{
  System.out.println(a[i].intValue()); // a[i] is null here, causing an NPE
}
于 2014-11-17T00:30:56.897 に答える
0
public <T> T[] toArray(T[] a)

すべての要素をコピーするためのパラメーターとして配列を取り、その配列を返します。配列が十分に大きい場合は、それ以外の場合は実行時に同じ新しい配列がこの目的のために割り当てられます。あなたの場合、 a はサイズ 2 です。そのため、サイズ 3 の新しい配列 a が実行時に作成され、値がこの新しい配列にコピーされて返されます。

iの代わりにa [i]を印刷している2番目のこと。i には要素の値が含まれているため、i を出力します。

このようなもの:

public static void main(String args[])
{
    ArrayList<Integer> al=new ArrayList<>();
    al.add(1);
    al.add(2);
    al.add(3);
    Integer a[]=new Integer[2];
    a=al.toArray(a);
    for(Integer i:a) //or for(int i:a)
    System.out.println(i);
}
于 2014-11-17T01:07:28.857 に答える