尝试创建ArrayList时获取NullPointerException

时间:2015-04-21 15:27:26

标签: java

我正在制作一个arraylist,它会将随机的瓷砖添加到一个包中以进行拼字游戏。我的老师在解释事情方面做得非常糟糕,所以我不得不完成这一切。我已经为包创建了构造函数,并且我正在尝试创建包,但在调用时遇到空指针异常。

线程中的异常" main"显示java.lang.NullPointerException     在h2.RandBag.add(RandBag.java:11)​​

主要是返回错误的代码:

    for (Integer ival : rbag)
      System.out.println(ival);

继承了我用于构建的方法。

private ArrayList<E> bag; // container
private Random rand;      // random generator

//constructors
public RandomBag(){
  this.bag = new ArrayList<E>();
  this.rand = new Random();

public RandomBag(int seed) {
  this.bag = new ArrayList<E>();
  this.rand = new Random(seed);

迭代器,因为它返回null并且可能是问题。

public Iterator<E> iterator() {

    return null;
}

我尝试过返回不同的内容,但每次都会出错。迭代器没有得到解释,所以我可能会遗漏一些东西。

RandomBag<Integer> rbag = new RandomBag<Integer>(17);
for (int i = 0; i < 8; ++i)
rbag.add(10+i);

3 个答案:

答案 0 :(得分:10)

更好的iterator()实施

虽然,我不知道你的所有要求和当前的实现,但我很确定这是一个更好的实现:

public Iterator<E> iterator() {
    return bag.iterator();
}

foreach循环的说明

请注意:

for (Integer ival : rbag)
    System.out.println(ival);

...只是语法糖:

Iterator<Integer> it = rbag.iterator();
while (it.hasNext())
    System.out.println(it.next());

然后会解释NullPointerException

最佳实践

请注意,如果您不想完全实现List之类的接口,而不是简单地返回null,那么最好抛出异常:

public Iterator<E> iterator() {
    throw new UnsupportedOperationException();
}

然后更清楚的是为什么事情不起作用(还)

答案 1 :(得分:4)

是的,iterator()返回null是问题所在。

for循环基本上是糖:

Iterator<Integer> iter = rbag.iterator();
while (iter.hasNext()) {
    Integer ival = iter.next();
    System.out.println(ival);
}

如果iterator()返回null,则iter.hasNext()调用将导致NullPointerException。

答案 2 :(得分:1)

写这个:

 for (Integer ival : rbag)
      System.out.println(ival);

与写这个相同:

for (Iterator<Integer> iterator = rbag.iterator(); iterator.hasNext(); ) {
   Integer ival = iterator.next();
   System.out.println(ival);
}

这只是一种语法糖。因此,如果从集合(rbag)返回null迭代器,它将始终以NullPointerException结束(java将尝试在之后立即询问.hasNext()的迭代器)

我建议你做点什么

public Iterator<E> iterator() {
    return this.bag.iterator();
}