2012-03-08 5 views
1

Я использую класс сканера в Java5, и следующий код будет сгенерировано исключение:класс Scanner в Java5 бросить java.lang.NullPointerException

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

StackTrace является:

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) 

кого-ли знает, что вызвало это исключение?

+4

Было бы полезно упомянуть, что вы используете GCJ, а не Sun/Oracle JDK ... (Вы знали, что были, верно?) –

+0

Можете ли вы разместить содержимое файла, который вы тестируете с? – Adam

+0

@JonSkeet Как вы смогли это определить? –

ответ

2

The GCJ Home Page предполагает, что «поддерживает большинство библиотек 1.4 плюс некоторые дополнения 1.5.»

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

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

+0

java на компьютере настроен кем-то другим, он не в моем распоряжении ... Есть ли еще один решение, за исключением возврата к Sun JDK? – cheng

+0

Вы можете установить Java самостоятельно (в своем домашнем каталоге). Вам нужно это сделать, и человек, который контролирует систему, должен правильно настроить машину, или вам не нужно это делать.Вы не сможете добиться успеха в проекте, если вам не будет оказана правильная поддержка. Возможно, вы сможете заставить это работать, но это, вероятно, будет повторяющейся проблемой, даже если вы считаете, что закончили, вы можете столкнуться с странными проблемами, которые, как я подозреваю, будут вашей проблемой. ;) –

+0

Хорошо, я знаю, в чем проблема сейчас. Спасибо за вашу любезную помощь. – cheng

0

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

Вот код, составленный на 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 в последней строке файла.

Обход

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

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

  • Нет связанных вопросов^_^