2016-03-26 38 views
2

所以由於某種原因,我得到一個java.lang.Exception:java.util.NoSuchElementException。這些價值正在像這樣冒險。StringTokenizer「NoSuchelementException」

back 
bison 
1.0 
back 
dog 
3.0 
becaue 
bison 
1.0 
best 
bison 
1.0 
david 
bison 
1.0 
ever 
bison 
1.0 
i 
bison 
1.0 
i 
dog 
4.0 
im 
bison 
1.0 
is 
bison 
1.0 

但在最後我得到的NoSuchElementException異常:

我的代碼很簡單:

StringTokenizer line = new StringTokenizer(new String(value.getBytes())); 
    while (line.hasMoreElements()){ 
     Text unWord = new Text((String) line.nextElement()); 
     String unAuth = (String) line.nextElement(); 
     float unVal = Float.parseFloat(line.nextToken()); 

     System.out.println(unWord); 
     System.out.println(unAuth); 
     System.out.println(unVal); 
    } 

我似乎無法找出原因的內容將打印出來,但我最後會得到noSuchelementException。

回答

2

問題是您每次迭代撥打hasMoreElements()一次,但您撥打nextElement/nextToken三次。這是容易出錯的。即使文件遵循確切的格式,比如您的情況,最後可能會出現空行。

它看起來正是你的情況發生了什麼:當你問是否分詞器有更多的元素,你得到true,但只有一個元素,這恰好是一個新的行字符。第一個電話nextElement成功,但第二個失敗。

爲了解決這個問題,每次調用nextElement前加hasMoreElements()檢查,並退出如果沒有下一個元素:

Text unWord = new Text((String) line.nextElement()); 
if (!line.hasMoreElements()) break; 
String unAuth = (String) line.nextElement(); 
if (!line.hasMoreElements()) break; 
float unVal = Float.parseFloat(line.nextToken()); 
+0

謝謝。它正在接受一個新的人物角色並將其拋棄。 –

1

那麼你打電話line.nextElement()兩次,而只檢查一次line.hasMoreElements()。難道最後只剩下一個元素,而不是兩個?

0

在你的每個循環迭代,你一次測試中是否有任何可用的更多的令牌,然後嘗試從標記器中繪製三個標記。如果所有三個標記均已成功繪製,則可以打印結果,但只有一個才能成功繪製。如果原始字符串中的令牌總數不是三的倍數,那麼您肯定會得到一個NoSuchElementException。如果你認爲你的數據看起來和你期望的一樣,那麼這可能是由於你的原始字符串中有空格(在最後產生一個意外的空標記)。