簡體   English   中英

StringTokenizer“ NoExploranceException”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM