2016-03-26 9 views
2

Bazı nedenlerle java.lang.Exception alıyorum: java.util.NoSuchElementException. Değerler böyle devam ediyor.StringTokenizer "NoSuchelementException"

benim kod basittir:

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 

Ama en sonunda ben NoSuchelementException olsun

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); 
    } 

Ben Elemanları yazdırmak neden anlamaya görünüyor, ama olamaz sonunda bir noSuchelementException alırdı.

cevap

2

Sorun, yineleme başına bir kez hasMoreElements() numaralı telefonu aramanız, ancak üç kez nextElement/nextToken numaralı telefonu aramanızdır. Bu hataya eğilimli. Dosyanızda olduğu gibi dosya tam biçimi izlese bile, sonunda boş bir satır olma olasılığı vardır.

Durumunuzda tam olarak ne olduğu görünüyor: belirtecin daha fazla öğeye sahip olup olmadığını sorduğunuzda, true elde edersiniz, ancak yeni bir satır karakteri olan yalnızca bir öğe vardır. nextElement'a yapılan ilk çağrı başarılı olur, ancak ikincisi başarısız olur.

hiçbir sonraki eleman varsa bu sorun nextElement yapılan her çağrı önce hasMoreElements() çek ekleyin ve çıkmak düzeltmek için: bir daha belirteçleri mevcut olup olmadığını bir kez her döngü tekrarında günü

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

Teşekkür ederiz. Yeni bir çizgi karakteri kabul ediyor ve atıyordu. –

1

line.nextElement() numaralı telefonu arayarak, yalnızca bir kez line.hasMoreElements() numaralı telefonu denetleyebilirsiniz. Sonunda sadece bir tane geriye kalan eleman var mı, iki değil mi?

0

, test ve sonra belirteçten üç jeton çizmeye çalışın. Üç simgenin tümü başarıyla çizilirse sonuçları yazdırırsınız, ancak başarıyla çekilmekte olan bir güvencesinden de emin olabilirsiniz. Orijinal dizgedeki belirteçlerin toplam sayısı üçten fazla değilse, o zaman kesinlikle bir NoSuchElementException alırsınız. Verilerinizin beklediğiniz gibi gözüktüğünü düşünüyorsanız, bu durum orijinal dizenizde boşluk bırakarak ortaya çıkabilir (sonuçta beklenmeyen bir boş jeton elde edilir).

İlgili konular