Класс сканера в Java5 выдает java.lang.NullPointerException - PullRequest
1 голос
/ 08 марта 2012

Я использую класс сканера в java5, и следующий код выдаст исключение:

Scanner scanner = new Scanner
        (new File(args[0]));
int dealId;
while (scanner.hasNextLine()) {
    dealId = scanner.nextInt();
    System.out.println(dealId);
}
scanner.close();

Трассировка стека:

Exception in thread "main" java.lang.NullPointerException
   at java.util.regex.Matcher.toMatchResult(libgcj.so.10)
   at java.util.Scanner.myCoreNext(libgcj.so.10)
   at java.util.Scanner.myPrepareForNext(libgcj.so.10)
   at java.util.Scanner.myNextLine(libgcj.so.10)
   at java.util.Scanner.hasNextLine(libgcj.so.10)

Кто-нибудь знает, что вызвало это исключение?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Домашняя страница GCJ предполагает, что она "поддерживает большинство библиотек 1.4 плюс некоторые дополнения 1.5".

Сканер был добавлен в версии 1.5, и я подозреваю, что вы столкнулись с какой-то функциональностьюGCJ не поддерживает.Вам нужно попробовать что-то другое, чтобы увидеть, что вы можете получить для работы.

Есть ли причина, по которой вы не используете OpenJDK / Oracle Java 6 или 7?(Пожалуйста, не говорите это по причинам производительности;)

0 голосов
/ 21 июля 2017

Я воспроизвел ошибку и нашел работу вокруг

Вот код, скомпилированный в x86_64 GNU / Linux, Fedora с Java 1.5.0:

Scanner r = new Scanner(f, "ISO-8859-1");
while(r.hasNext()){
    String line = r.nextLine();   //The guts of nextLine(), specifically: 
                                  //Matcher.toMatchResult bubbles up a 
                                  //nullPointerException
}

Файл содержит только два слова ascii, разделенных новой строкой.Исключение времени выполнения возникает только тогда, когда nextLine обрабатывает последнюю строку файла, независимо от того, содержит он символы или нет:

java.lang.NullPointerException
   at java.util.regex.Matcher.toMatchResult(libgcj.so.10)
   at java.util.Scanner.myCoreNext(libgcj.so.10)
   at java.util.Scanner.myPrepareForNext(libgcj.so.10)
   at java.util.Scanner.myNextLine(libgcj.so.10)
   at java.util.Scanner.nextLine(libgcj.so.10)
   at Main.parseFile(Main.java:1449)
   at Main.construct(Main.java:1420)
   at Main.populateBlogPosts(Main.java:1399)
   at Main.main(Main.java:263)

Вот отчет об ошибке по этой проблеме: https://bugs.openjdk.java.net/browse/JDK-6178785

Диагностика

Это ошибка в libgcj.so.10, совершенно допустимый ввод ascii, а также пробел заставляет его рвать NPE в последней строке файла.

Обходной путь

Поскольку эта ошибка возникает только в самой последней строке файла, хакерский обходной путь заключается в том, чтобы изначально убедиться, что в конце файла есть хотя бы одна новая строка.затем перехватите и проигнорируйте исключение nullPointerException, всплывающее из toMatchResult, и выйдите из цикла, когда это произойдет.

...