我正在嘗試編寫模擬拼字遊戲的代碼。我設計了一個應該模擬拼字遊戲包的類,我試圖在選擇一個隨機拼圖後,通過在main中打印tileID來測試它。每當我雖然運行的代碼,我不斷收到以下錯誤:爲什麼我收到「必須是正面的」錯誤?
Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive at java.util.Random.nextInt(Random.java:388) at hw3.RandomBag.randomPick(RandomBag.java:39) at hw3.RandomBag.main(RandomBag.java:59
有人可以告訴我爲什麼我收到這個錯誤?
import java.util.*;
public class RandomBag<E> implements Iterable<E> {
// instance varibles
private List<E> bag; // arraylist as the container
private Random rand; // random number generator
// constructors
public RandomBag() {
bag = new ArrayList<E>();
rand = new Random();
}
public RandomBag(int seed) {
bag = new ArrayList<E>();
rand = new Random(seed);
}
// returns the size of the bag
public int size() { return this.bag.size(); }
public boolean isEmpty() { // returns true/false if the bag is/is not empty
if (this.bag.isEmpty())
return true;
else
return false;
}
// adds the parameter element in the bag
public void add (E element) {this.bag.add(element);}
// randomly selects an element using the random number generator 'rand' and removes that element from the bag, and returns the element
public E randomPick() {
int index = rand.nextInt(this.bag.size());
E tileID = bag.remove(index);
return tileID;
}
// obtains an iterator for the bag, and returns it
public Iterator<E> iterator() {
// traverse bag using an iterator
Iterator it = bag.iterator();
return it;
}
//**
//** main() for testing RandomBag<E>
//**
public static void main(String[] args) {
RandomBag bag = new RandomBag();
Object tileID = bag.randomPick();
System.out.println(tileID);
}
}
我感到困惑,因爲即使我選擇的任意數,並把它在的地方this.bag.size的' ()',我仍然得到錯誤:'在線程中的異常「主」java.lang.IndexOutOfBoundsException:索引:0,大小:0 \t在java.util.ArrayList.rangeCheck(ArrayList.java:653) \t at在hw3.RandomBag.main(java.util.ArrayList.remove(ArrayList.java:492) \t Bag.java:59) ' –
雖然正確,但我會爭辯說Javadoc不夠明確。零是一個正數嗎?它沒有用連字符作爲前綴,所以有些人可能會說是。在其他情況下,有0的顯式正面和負面版本。文檔可能會更好地聲明「必須是正數,大於0」。 – adelphus
@OmarN這是一個完全不同的錯誤。如果你的列表爲空,試圖爲任何索引調用'remove'將導致'IndexOutOfBoundsException'。在調用'randomPick'之前,你應該確保你的List不是空的。這樣你的原始代碼就可以工作。 – Eran