我正在制作一个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);
答案 0 :(得分:10)
iterator()
实施虽然,我不知道你的所有要求和当前的实现,但我很确定这是一个更好的实现:
public Iterator<E> iterator() {
return bag.iterator();
}
请注意:
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();
}