2016-03-26 5 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); 
    } 

私はElementsはオフに印刷する理由を把握するように見えるが、私はできません最後にnoSuchelementExceptionが返されます。

答えて

2

問題は、繰り返しごとにhasMoreElements()を呼び出すことですが、nextElement/nextTokenを3回呼び出すことが問題です。これはエラーが起こりやすい。たとえファイルがあなたの場合のように正確なフォーマットに従っていても、最後に空白行がある可能性があります。

あなたのケースでは正確に何が起こっているかのように見えます。トークナイザに要素が増えているかどうか尋ねると、trueが得られますが、新しい行の文字が1つしかありません。 nextElementへの最初の呼び出しは成功しますが、2番目の呼び出しは失敗します。あなたのループの各反復で

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()を1回だけチェックしてください。最後に2つではなく1つの残りの要素があるのでしょうか?

0

利用可能なトークンがあるかどうかと、あなたがテスト:なし次の要素がない場合nextElementに各呼び出しの前にhasMoreElements()チェックを追加し、終了してこの問題を解決するには

トークナイザから3つのトークンを引き出そうとします。 3つのトークンすべてが正常に描画された場合は結果を出力しますが、のうちの1つがのみ正常に描画されていると確信できます。元の文字列のトークンの合計数が3の倍数でない場合、確かにNoSuchElementExceptionが得られます。あなたのデータが期待どおりに見えると思うなら、それは元の文字列の後に続く空白(最後に予期しない空のトークンを生成する)から生じるかもしれません。

関連する問題