2015-10-11 48 views
2

我正在嘗試編寫模擬拼字遊戲的代碼。我設計了一個應該模擬拼字遊戲包的類,我試圖在選擇一個隨機拼圖後,通過在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); 

    } 
} 

回答

8

如果this.bag.size()爲0,則傳遞了無效的參數nextInt()

這在Javadoc明確規定:

n the bound on the random number to be returned. Must be positive.

nextInt(n)返回0和n-1之間的數。你認爲nextInt(0)返回什麼?

在你的主要方法中,你試圖挑選一個空袋子的元素。它不能工作。在致電randomPick()之前,您應該檢查包的大小。當袋子空了時,randomPick()應該會拋出異常。

public static void main(String[] args) { 

    RandomBag bag = new RandomBag(); 

    Object tileID = null; 
    if (bag.size() > 0) 
     tileID = bag.randomPick(); 
    System.out.println(tileID); 

} 
+0

我感到困惑,因爲即使我選擇的任意數,並把它在的地方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) ' –

+0

雖然正確,但我會爭辯說Javadoc不夠明確。零是一個正數嗎?它沒有用連字符作爲前綴,所以有些人可能會說是。在其他情況下,有0的顯式正面和負面版本。文檔可能會更好地聲明「必須是正數,大於0」。 – adelphus

+0

@OmarN這是一個完全不同的錯誤。如果你的列表爲空,試圖爲任何索引調用'remove'將導致'IndexOutOfBoundsException'。在調用'randomPick'之前,你應該確保你的List不是空的。這樣你的原始代碼就可以工作。 – Eran

1

錯誤說明了一切:

Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive 
    at java.util.Random.nextInt(Random.java:388) 

每當必然是zeronegative,它是一個非法參數rand.nextInt()。確保this.bag.size()從不zero

+0

這是有道理的,但是即使我把一個任意數字代替'this.bag.size()',我也會感到困惑:在線程「main」中的異常java.lang.IndexOutOfBoundsException:索引:0,大小:0 \t at java.util.ArrayList.rangeCheck(ArrayList.java:653) \t at java.util.ArrayList.remove(ArrayList。 java:492) \t at hw3.RandomBag.randomPick(RandomBag.java:40) \t at hw3.RandomBag.main(RandomBag.java:59) ' –

1

該錯誤是因爲線62在類的情況發生:

int index = rand.nextInt(this.bag.size()); 

如果空着袋子調用此代碼,它將始終返回0

下一個步驟是檢查

if (bound <= 0) 
     throw new IllegalArgumentException(BadBound); 

由於我們:線387類java.util.Random總是從this.bag.size()得到0,它總是會拋出異常。

要讓它工作,確保元素添加到包,如:

public static void main(String[] args) { 

    RandomBag bag = new RandomBag(); 

    for (int i = 0; i < 10; i++) { 
     bag.add(i); // adding elements 
    } 

    Object tileID = bag.randomPick(); 

    System.out.println(tileID); 

} 
相關問題