2013-11-15 36 views
-1

這基本上告訴我,我的數組沒有長度...爲什麼?我甚至用無意義的循環初始化它!java - ArrayIndexOutOfBoundsException:0

public class NumberCollection{ 
public int arraySize; 
public int count=0; 
Scanner in = new Scanner(System.in); 
public NumberCollection(int arraySiz){ 
    if(arraySiz>0){ 
    arraySize=arraySiz; 
    } 
    else{ 
     arraySize=1; 
    } 
} 

int[] numberArray = new int[arraySize]; 

public void doThis(){ 
    for(int q=0; q<arraySize; q++){ 
     numberArray[q]=0; 
    } 
} 

public int indexOf(int searchingNum){ 
    Arrays.sort(numberArray); 
    int lo=0; 
    int hi=numberArray.length; 

    while(lo<hi){ 
     int i=(lo+hi)/2; 
     if(numberArray[i]==searchingNum){ 
      return i; 
     } 
     else if(numberArray[i]<searchingNum){ 
      lo=i; 
     } 
     else{hi=i;} 
    } 
    return -1; 
    } 

public boolean addNumber(int number){ 
    NumberCollection col = new NumberCollection(arraySize); 
    if(col.indexOf(number)==(-1)){ 
     if(count==arraySize){ 
      numberArray=Arrays.copyOf(numberArray,(arraySize*2)); 
      numberArray[count]=number; 
      count++; 
      return true; 
     } 
     else{ 
      numberArray[count]=number; //This is where the exception is. 
      count++; 
      return true; 
     } 
    } 
    else { 
     return false; 
    } 
    } 
public static void main(String[] args){ 
    NumberCollection col = new NumberCollection(5); 
    col.doThis(); 
    col.addNumber(4); 
} 
} 

回答

1

它的長度爲0,因爲這就是你它初始化什麼:

public int arraySize; // int initializes to 0 automatically 
int[] numberArray = new int[arraySize]; 

的構造函數,你分配arraySize別的東西不運行,直到所有的初始化發生之後。使內部構造新的數組:

private int arraySize = 1; 
private int[] numberArray; 

public NumberCollection(int arraySiz){ 
    if (arraySiz > 0) { 
     arraySize = arraySiz; 
    } 
    numberArray = new int[arraySize]; 
} 
+0

但如果我這樣做,那麼陣列將不就是塊的外部可見 – Taylor

+1

聲明它作爲一個字段,並在構造函數中新的數組。 – Radiodef

+0

好吧,用這個,現在indexOf方法不返回一個值。 – Taylor

1

看來它會是更直接初始化構造函數中的數組而不是把一個潛在的大小零狀態的。

public NumberCollection(int arraySiz){ 
    if(arraySiz>0){ 
     numberArray = new int[arraySiz]; 
    } else { 
     numberArray = new int[1]; 
    } 
} 

原因是:all variables start with a default value,和前該對象被完全實例化,你的陣列的長度已經被設置(因爲arraySize值被用於構造前的數組初始化)。

+0

好吧,我試了這個(謝謝你),現在它不會返回任何東西。終端只需要無盡的輸入 – Taylor

+0

聽起來像一個與我回答的問題正交的問題。我什至不知道你的掃描儀正在用於輸入,所以我不知道我可以有很多幫助... – Makoto

+0

確切地說,我甚至沒有宣佈掃描儀哈哈。當我運行它時,終端打開時沒有打印,我可以無休止地輸入任何內容,並返回。 – Taylor

0

移動這一行:

int[] numberArray = new int[arraySize]; 

裏面你constructor,作爲最後一道防線。

並在您聲明所有其他類級別變量的頂部添加private int[] numberArray;

0

當您設置int[] numberArray = new int[arraySize]時,此行在任何方法之外,並且在構造函數被調用之前執行。由於這個原因,初始化numberArray及其大小時,arraySize將始終爲空值。

相關問題