2012-03-08 48 views
1

我使用的掃描儀類Java5的,下面的代碼會拋出異常:Scanner類扔顯示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(); 

堆棧跟蹤是:

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 ......(你知道你是,對嗎?) – 2012-03-08 10:06:01

+0

你可以發佈你正在測試的文件的內容嗎用? – Adam 2012-03-08 10:07:27

+0

@JonSkeet你怎麼能夠確定? – 2012-03-08 10:09:00

回答

2

GCJ Home Page建議它「支持大多數1.4庫加上一些1.5補充。」在1.5版本中加入

掃描儀和我懷疑你都創下了一項功能GCJ不支持。你需要嘗試一些不同的東西來看看你可以工作。

有什麼理由不使用OpenJDK/Oracle Java 6或7嗎? (請不要說其性能方面的原因;)

+0

機器上的java由別人配置,它超出了我的控制範圍...是否有其他解決方案除了回到Sun JDK? – cheng 2012-03-08 10:23:01

+0

您可以自己安裝Java(在您的主目錄中)您可以執行此操作,並且控制系統的人員應該正確設置機器,或者您不需要這樣做。除非得到正確的支持,否則你無法在項目中取得成功。你或許可以得到這個工作,但這可能是一個反覆出現的問題,即使在你認爲你已經完成後,你可能會遇到奇怪的問題,我懷疑這會是你的問題。 ;) – 2012-03-08 10:29:24

+0

好的,我知道現在有什麼問題。感謝您的親切幫助。 – cheng 2012-03-08 10:31:47

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輸入以及blankstring會導致它在文件的最後一行捅出NPE。

解決方法

由於這個錯誤只發生在文件的最後一行,在哈克的解決方法是先確保有在文件的結尾至少有一個換行符,然後捕捉並忽略nullPointerException從toMatchResult冒出並在這種情況發生時退出循環。

相關問題