/ / Клас сканера в Java5 throw java.lang.NullPointerException - java, java.util.scanner, gcj

Клас сканера в Java5 кинути java.lang.NullPointerException - java, java.util.scanner, gcj

Я використовую клас сканера в 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 для відповіді № 1

The Домашня сторінка GCJ вважаю, що він "підтримує більшість бібліотек 1,4 плюс приблизно 1,5 доповнення".

Сканер був доданий у версії 1.5, і я підозрюю, що ви скористались функціоналом, який GCJ не підтримує. Вам потрібно спробувати щось інше, щоб побачити, що ви можете приступити до роботи.

Чи є причина, через яку ви не використовуєте OpenJDK / Oracle Java 6 або 7? (Будь ласка, не вказуйте його з міркувань ефективності;)


0 для відповіді № 2

Я відтворив помилку і знайшов обхід

Ось код, скомпільований на 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, і вийти з циклу, коли це трапиться.