Java: чтение целых чисел из файла в массив

File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);

int [] tall = new int [100];

String s =in.readLine();

while(s!=null)
{
    int i = 0;
    tall[i] = Integer.parseInt(s); //this is line 19
    System.out.println(tall[i]);
    s = in.readLine();
}

in.close();

Я пытаюсь использовать файл «Tall.txt» для записи содержащихся в них целых чисел в массив с именем «tall». В некоторой степени он это делает, но также, когда я его запускаю, он выдает следующее исключение (:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at BinarySok.main(BinarySok.java:19)

Почему именно это происходит и как это удалить? Как я вижу, я читаю файл как строки, а затем конвертирую его в целые числа, что не является незаконным.

Кстати, вы должны объявить «i» вне цикла while. если нет, вы всегда будете вставлять целые числа в индекс 0 вашего массива.

Julien Grenier 20.11.2008 04:23

Кстати, комментарий «это строка 19» является кандидатом на «Лучший комментарий из когда-либо виденных». Какую IDE вы используете?

Markus Lausberg 27.04.2009 12:28

Я понятия не имею, как это произошло. Думаю, я откуда-то взял части кода, и, видимо, пришли комментарии.

Northener 10.05.2009 08:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
3
183 570
6

Ответы 6

В вашем файле должна быть пустая строка.

Вы можете заключить свои вызовы parseInt в блок "try":

try {
  tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
  continue;
}

Или просто проверьте наличие пустых строк перед синтаксическим анализом:

if (s.length() == 0) 
  continue;

Обратите внимание, что при инициализации вашей индексной переменной i внутри цикла она всегда равна 0. Вы должны переместить объявление перед циклом while. (Или сделайте его частью цикла for.)

по всей вероятности, это ПОСЛЕДНЯЯ строка файла.

John Gardner 20.11.2008 03:25

Похоже, Java пытается преобразовать пустую строку в число. У вас есть пустая строка в конце ряда чисел?

Вероятно, вы могли бы исправить такой код

String s = in.readLine();
int i = 0;

while (s != null) {
    // Skip empty lines.
    s = s.trim();
    if (s.length() == 0) {
        continue;
    }

    tall[i] = Integer.parseInt(s); // This is line 19.
    System.out.println(tall[i]);
    s = in.readLine();
    i++;
}

in.close();

У вас может возникнуть путаница между разными окончаниями строк. В файле Windows каждая строка завершается символом возврата каретки и перевода строки. Некоторые программы в Unix будут читать этот файл, как если бы между каждой строкой была лишняя пустая строка, потому что они увидят возврат каретки как конец строки, а затем увидят перевод строки как другой конец строки.

Нет, не имеет значения, на какой платформе работает приложение, BufferedReader всегда проверяет наличие всех трех типов разделителей строк: \ r \ n (возврат каретки + перевод строки), \ n (только перевод строки) и \ r (каретка только возврат).

Alan Moore 20.11.2008 03:46

Возможно, вы захотите сделать что-то вроде этого (если вы используете java 5 и выше)

Scanner scanner = new Scanner(new File("tall.txt"));
int [] tall = new int [100];
int i = 0;
while(scanner.hasNextInt()){
   tall[i++] = scanner.nextInt();
}

@ Вануан: java.util.ArrayList

Mechanical snail 07.07.2012 11:18

Для сравнения вот еще один способ прочитать файл. У него есть одно преимущество: вам не нужно знать, сколько целых чисел находится в файле.

File file = new File("Tall.txt");
byte[] bytes = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);
fis.close();
String[] valueStr = new String(bytes).trim().split("\\s+");
int[] tall = new int[valueStr.length];
for (int i = 0; i < valueStr.length; i++) 
    tall[i] = Integer.parseInt(valueStr[i]);
System.out.println(Arrays.asList(tall));
File file = new File("E:/Responsibility.txt");  
    Scanner scanner = new Scanner(file);
    List<Integer> integers = new ArrayList<>();
    while (scanner.hasNext()) {
        if (scanner.hasNextInt()) {
            integers.add(scanner.nextInt());
        } else {
            scanner.next();
        }
    }
    System.out.println(integers);

Другие вопросы по теме