NumberFormatException при считывании чисел из файла

326
20 февраля 2017, 13:10

Есть текстовый файл, который содержит целые числа, каждое с новой строки:

num.txt

32
4
8
3
2

При выполнении следующего кода:

public static void main(String[] args) throws IOException {
    BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in));
    String name = reader1.readLine();
    BufferedReader reader = new BufferedReader(new FileReader(name));
    while (reader.ready()) {
        buf = reader.readLine();                      
        System.out.println(Integer.parseInt(buf));
    }
}

Вылетает ошибка NumberFormatException.
При работе с консолью всё работает нормально.

Считывает он вроде то что нужно:

public static void main(String[] args) throws IOException {
    BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in));
    String name = reader1.readLine();
    BufferedReader reader = new BufferedReader(new FileReader(name));
    String buf = "";
    try {
        while (reader.ready()) {
            buf = reader.readLine();                      
            System.out.println(Integer.parseInt(buf));
        }
    } catch (Exception e) {
        System.out.println("Мы считали: " + buf);
    }
}  

Мы считали: 32

Где ошибка?

Answer 1

Если метод trim не справляется с задачей (в частности, он удаляет только символы с кодами от 0 до 32 включительно и только из начала и конца строки), то справиться может replaceAll:

buf = buf.replaceAll("[^0-9]", "");

Который удалит из строки все символы, не являющиеся цифрами.

Чтобы выяснить какие же символы содержатся в строке, можно воспользоваться таким методом:

private static void displayChars(String str)
{
    for (int i = 0; i < str.length(); i++)
    {
        System.out.print((int)str.charAt(i) + " ");
    }
}

Если System.out.println("Мы считали: " + buf); заменить на displayChars(buf);, то должно стать понятно что же за символы "портят жизнь".

Таким символом может оказаться 65279 (то есть BOM), находящий в самом начале файла.

Answer 2

Ошибка возникает, скорее всего, из-за того, что после числа идет пробел или какой-то другой подобный символ. Есть предложение: после считывания строки вызвать для неё метод trim(). Этот метод удаляет пробелы в начале и конце строки.

Тогда парсинг будет выглядеть так:

Integer.parseInt(buf.trim())
READ ALSO
в клиент-сервере на RMI исключение java.lang.ClassNotFoundException:

в клиент-сервере на RMI исключение java.lang.ClassNotFoundException:

Клиент - сервер на RMI При старте под intelij idea, на стороне выбрасывается исключение

399
Пункты dropdown меню не видны из-под слайдера

Пункты dropdown меню не видны из-под слайдера

Только начинаю знакомиться с jquery да и версткой, собственно, тожеСделал дропдаун меню на jquery и следующим блоком слайдер на jquery

399