2013-04-13 2 views
1

Я могу прочитать файл с помощью сканера. Когда тип возврата недействителен, я могу читать и печатать данные на консоли, однако сразу же после этого он генерирует исключение ArrayOutOfBoundsException. В идеале, я хочу вернуться как массив строк, однако я получаю только исключение ArrayOutOfBoundsException. В обоих случаях исключение выбрасывается на линии рака [j] = input.nextLine(). Я уже убедился, что размер массива правильный. Когда я не фиксирую его размер, компилятор выдает исключение NullPointerException в той же строке (что имеет смысл, поскольку размер массива не объявлен).ArrayIndexOutOfBoundsException при чтении текстового файла

Мне нужен метод для возврата массива строк, поскольку мне нужно сделать дополнительные манипуляции с ним.

public String[] readCancer() { 
     cancers = new String[21]; 
    int j = 0; 
     try { 
     input = new Scanner(myData); 
     String result; 
     while(input.hasNext()) { 

      ++j; 
      cancers[j] = input.nextLine(); 
      //System.out.println(cancers[j]); 
     } 

    } catch (FileNotFoundException fnfx) { 
     JOptionPane.showMessageDialog(null, "Txt file could not be found"); 
    } 
    return cancers; 
} 

Я попытался переписывание метод в несколько иначе, но я получаю ту же ошибку, только на этот раз он находится на выходе [I] = результат;

public String[] readCancers() { 
    FileInputStream fis; 
    DataInputStream dis; 
    BufferedReader br; 
    InputStreamReader isr; 
    String result; 
    String[] output = new String[21]; 
    int i = 0; 
    try { 
     fis = new FileInputStream(myData); 
     dis = new DataInputStream(fis); 
     isr = new InputStreamReader(dis); 
     br = new BufferedReader(isr); 
     while((result = br.readLine()) != null) { 
      ++i; 
      output[i] = result; 
     } 
    } catch (FileNotFoundException fnfx) { 
     fnfx.printStackTrace(); 
    } catch (IOException iox) { 
     iox.printStackTrace(); 
    } 
    return output; 
} 
+2

Вы увеличиваете j и i, прежде чем делать что-либо с ними. Таким образом, ваш массив начинается с 1 вместо 0, давая вам всего 20 вместо 21 элемента массива. Я предполагаю, что ваш файл имеет 21 элемент, поэтому, когда добавлен 21-й элемент, он выходит за рамки. –

+0

Делая что-то вроде рака [j ++]; даст вам эффект добавления элемента при раках [j], а затем увеличит j в следующий раз. PS Я надеюсь, что вы делаете медицинские вещи, иначе рак - это ужасное имя переменной. –

+0

Чувак, можете ли вы разместить свой текстовый файл, чтобы мы знали, сколько строк в текстовом файле? –

ответ

0

Трудно узнать, сколько элементов имеет ваш файл, но я предполагаю, что у вас есть 21 элемент, поэтому вам нужен массив из 21 элемента. Вы объявили массив из 21 элементов, но следующий код:

++j; 

означает следующее:

j = j+1; 

И затем добавить элемент в массив, используя J, который приводит к вам пропуск J = 0, и 21-й элемент пытается попасть в 22-й элемент массива, который выходит за рамки. То, что вы могли бы хотеть что-то вроде этого:

cancers[j]; 
j++; 

Или:

cancers[j++]; 

Таким образом, вы не собираетесь выходить за пределы. Если у вас есть более 21 элемента, я бы предложил увеличить размер массива.

+0

Ваше предложение отлично работает! Я чувствую себя немного глупо на что-то очевидное, но мне нужно научиться думать о моей логике кодирования с более тонкой гребенкой. –

+0

Это случается. Чем больше вы кодируете, тем больше вы привыкнете к этим методам и этим ошибкам.Получайте удовольствие от своего проекта и отметьте ответ, принятый, если на ваш вопрос был дан ответ. –

0

В качестве комментаторов к вашему вопросу: это может быть ошибка типа «один за другим», потому что вы пропустили первый элемент массива. Но как только у вас есть фиксированный размер массива для чтения, вам придется связать значение i или j в цикле while в любом случае: while(input.hasNext() && j < 20) или while((result = br.readLine()) != null && i < 21). Затем после цикла проверьте, будет ли какой-либо дополнительный вход, что может указывать на ошибку, вы должны это обработать.

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