2013-11-15 6 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

Точно, у меня даже нет сканера, объявленного ха-ха.Когда я запускаю его, терминал открывается без печати, и я могу бесконечно набирать текст, нажимать return. – Taylor

0

Переместить эту строку:

int[] numberArray = new int[arraySize]; 

Внутри вашего constructor, в последней строке.

И добавьте private int[] numberArray; наверху, где вы объявляете все свои другие переменные уровня класса.

0

Когда вы установили int[] numberArray = new int[arraySize], эта строка находится вне любых методов и выполняется до вызова вашего конструктора. По этой причине arraySize всегда будет нулевым значением, когда вы инициализируете numberArray и его размер.

1

Переменные экземпляра инициализируются перед телом конструктора, поэтому ваш numberArray инициализируется нулевой длиной.

Вместо этого вы можете инициализировать массив в конструкторе.

Смотрите спецификацию Java Язык: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html

Смежные вопросы