繁体   English   中英

为什么在尝试填充数组时会出现NullPointerException?

[英]Why, when trying to populate an array, am I getting a NullPointerException?

我正在尝试使用有关int数组的信息填充BitSets数组

    //ar is a SIZE*SIZE 1-D int array, SIZE is a constant

    //decare BitSet array
    BitSet bs[] = new BitSet[SIZE];

    //initialize BitSet array
    for (BitSet x:bs)
        x = new BitSet();

    //populate BitSet array
    for (int i = 0 ; i < ar.length ; i++)
        if (ar[i] > 0)
            bs[(i/SIZE)].set(SIZE-(i%SIZE));

最后一行似乎是问题所在,但我看不出逻辑有什么问题。 有任何想法吗?

为了更清楚一点,如果我有一个像0,3,4,5,0,1,0,0,1,2,7,0,2,3,0,3,2,0的数组, 0,0,2,1,5,8,0,0,0,0,0,1,0,0,0,6,0,0

我想得到一个可以表示为011101,001110,110110,001111,000001,000100的位集数组

您的问题是对增强的for循环缺少了解。 基本上:

for (BitSet x:bs)
    x = new BitSet();

只是一块糖。 编译器将其扩展为以下内容:

for (int i = 0; i < bs.length; i++) {
    BitSet x = bs[i];
    x = new BitSet();
}

在此扩展中,很显然,您只是将新的位集分配给x并扔掉了。 您实际上根本没有修改数组。 您需要按以下方式初始化数组:

for (int i = 0; i < bs.length; i++) {
    bs[i] = new BitSet();
}

在Java中,“ foreach”构造的工作方式如下:

for (BitSet x:bs)
  x = new BitSet();

// is the same as:

for (int i = 0; i < bs.length; i++) {
  BitSet x = bs[i];
  x = new BitSet();
}

您的问题是您没有分配回数组,并且无法通过“ foreach”构造来实现。 您必须使用普通的“ for”循环:

for (int i = 0; i < bs.length; i++) {
  bs[i] = new BitSet();
}

您正在将新创建的对象分配给一个临时变量x

尝试以下类似的方法。

        int i=0;
        for (BitSet x:bs)
            {
                x = new BitSet();
                bs[i++] = x; //This will initialize the array elements
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM