2013-03-22 99 views
2

我在Eclipse中有一個JUnit測試(我嘗試過使用Junit 3和JUnit 4),它檢查解析文件的方法但出於某種原因我不知道它凍結或掛起,當我用這個:爲什麼scanner.next()會導致JUnit測試掛起

while(scanner.hasNextLine() && scanner !=null){ 
    if(scanner.hasNext()){ do something } 
} 

但是當我用下面的正常工作:

while(scanner.hasNextLine() && scanner !=null && scanner.hasNext()){ 
    do something 
} 

在「做什麼」並指出,除了分配scanner.next特殊的代碼()變量,在這兩種情況下,使用System.out.print()實際上都會輸出正常。這些是不是在做同樣的事情?這是一個合理的錯誤(如果是這樣請解釋爲什麼)或者它是一個愚蠢的錯誤?

+4

你爲什麼要檢查'null' _after_ dereferencing'scanner' - 這看起來像一個bug。任何爲什麼你需要檢查'hasNextLine()'_and_'hasNext()'? – 2013-03-22 17:04:51

回答

3

首先,在解引用引用之前檢查null。 變化

while(scanner.hasNextLine() && scanner !=null){ 
    if(scanner.hasNext()){ do something } 
}

這樣:

while(scanner !=null && scanner.hasNextLine()){ 
    if(scanner.hasNext()){ do something } 
}

寫在你的示例代碼,你會發現空掃描儀的情況下,但是(!掃描儀= NULL)永遠不會不管。相反,您會通過NullPointerException發現空掃描器。

接下來,您在您的問題中提到您「將scanner.next()分配給變量」。 顯示一些代碼。您必須爲每個nextLine呼叫撥打一個hasNextLine電話,並且您必須爲每個next呼叫撥打一個hasNext電話。看起來你可能會這樣做:

while (blam.hasNext()) 
{ 
    blah = blam.next(); 
    hoot = blam.next(); 
} 

這是完全錯誤的。第二個下一個電話會導致問題。

相關問題