2013-11-15 35 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将始终为空值。

相关问题