[英]StringTokenizer “NoSuchelementException”
所以由於某種原因,我得到了一個java.lang.Exception:java.util.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
但是最后我得到了NozhilementException:
我的代碼很簡單:
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);
}
我似乎無法弄清楚為什么會打印出Elements,但是最后我會得到一個noCHIlementException。
問題是您每次迭代都調用一次hasMoreElements()
,但是又調用了一次nextElement
/ nextToken
3次。 這容易出錯。 即使文件遵循正確的格式(例如您的情況),也可能在末尾有一個空行。
看起來這正是您的情況:當您問問令牌生成器是否包含更多元素時,您會得到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());
好吧,您兩次調用line.nextElement()
,而只檢查一次line.hasMoreElements()
。 可能是最后只剩下一個元素,而不是兩個嗎?
在循環的每次迭代中,只需測試一次是否還有可用的令牌,然后嘗試從令牌生成器中提取三個令牌。 如果成功繪制了所有三個標記,則可以打印結果,但是您可以確信只有一個成功繪制了標記。 如果原始字符串中的令牌總數不是三的倍數,那么您肯定會得到NoSuchElementException
。 如果您認為自己的數據看起來像您期望的那樣,則可能是由於在原始字符串中尾隨空格引起的(最后產生一個意外的空令牌)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.