NoElementException aber ich drucken Sie das Element und erhalten das erwartete Ergebnis
Frage
Was ich versuche zu tun ist, ein Verschieben von Objekten in einem Vektor speichern topMoves genannt. Es wird viele Objekte verschieben sein, weshalb ich das Objekt in der Schleife erstellen.
Die pastPriceMap Läden die Preise für Aktien zu einem bestimmten vergangenen Zeit (in diesem Fall vor einer Minute). Die currPriceMap speichert Preis für Aktien einige Zeit innerhalb der letzten Sekunde.
Ich erhalte die folgende Ausnahme:
Exception in thread "Timer-0" java.util.NoSuchElementException
Das ist die Linie, die das Problem verursacht: amove.setInitPrice (pastPriceMap.get (iter.next ()));
Der Code-Schnipsel ist unten. Wenn ich die System.out.printin Aussagen bekomme ich die erwartete Ausgabe:
Iterator<String> iter = sortedTopCodes.iterator();
while(iter.hasNext()){
System.out.println(currPriceMap.get(iter.next()));
System.out.println(pastPriceMap.get(iter.next()));
Move amove = new Move();
amove.setSecCode(iter.next());
amove.setPrice(currPriceMap.get(iter.next()));
amove.setInitPrice(pastPriceMap.get(iter.next()));
topMoves.add(amove);
}
return topMoves;
Move Klasse sieht wie folgt aus:
private String secCode;
private double price;
private double initPrice;
public String getSecCode() {
return secCode;
}
public void setSecCode(String secCode) {
this.secCode = secCode;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getInitPrice() {
return initPrice;
}
public void setInitPrice(double lastPrice) {
this.initPrice = lastPrice;
}
Lösung
Kurze Antwort:
Für jeden Aufruf von hasNext () sollte es nur ein Anruf auf next ()
seinIn Ihrem Code Sie haben 5 next () mit nur ein hasNext ()
Hier lesen Sie: http: // java.sun.com/javase/6/docs/api/java/util/Iterator.html
Bearbeiten
Lange Antwort:
Im Grunde wird ein Iterator verwendet, um ... na ja, die Elemente von „etwas“ tipically eine Sammlung iterieren, aber es könnte alles sein (selbstverständlich, dass alles, was einen Iterator zurückgibt).
Da Sie nicht wissen, wie viele Elemente hat, dass „alles“ haben, muss es eine Möglichkeit geben, direkt zu stoppen Iterieren? (Wenn es ein Array war, können Sie durch die Länge Eigenschaft sagen, aber der Iterator wird verwendet, um „einkapseln“, um die Datenstruktur in der Implementierung verwendet) Wie dem auch sei.
Der Iterator API definiert diese beiden Methoden
-hasNext(): boolean
-next(): Object ( or <E> since Java 1.5 )
So ist das typische Idiom ist dies:
while( iterator.hasNext() ) { // reads: while the iterator has next element
Object o = iterator.next(); // give me that element
}
Was passiert, wenn der Iterator nur zwei Elemente hat?
while( iterator.hasNext() ) { // the first time will return true, so the next line will be executed.
Object o = iterator.next(); // give me that item. ( 1st element )
Object b = iterator.next(); // oops dangerous by may work ... ( 2nd element )
Object c = iterator.next(); // eeeerhhh... disaster: NoSuchElementException is thrown.
}
Dies ist, was mit Ihnen geschieht. Sie wurden nicht bestätigt, ob der Iterator ein anderes Element hat, können Sie es nur abrufen. Wenn der Iterator einige Elemente haben geschieht, kann es für eine Weile arbeiten, aber es wird eine Zeit sein (wie Sie gerade gesehen haben), wenn es fehlschlägt.
Durch die Art und Weise, NICHT denke, auch in NoSuchElementException zu kontrollieren. Das ist eine Laufzeitausnahme und es zeigt an, dass etwas in Ihrem Code Logik festgelegt werden sollte.
Siehe diese Antwort um mehr über die Ausnahmen kennen.
Andere Tipps
Hier ist eine Version des neuen for-Schleifen mit:
for ( String secCode : secCodeList ) {
System.out.println(currPriceMap.get(secCode));
System.out.println(pastPriceMap.get(secCode));
Move amove = new Move();
amove.setSecCode(secCode);
amove.setPrice(currPriceMap.get(secCode));
amove.setInitPrice(pastPriceMap.get(secCode));
topMoves.add(amove);
}
in der älteren Art und Weise:
String secCode = null;
for ( Iterator<String> it = secCodeList.iterator(); it.hasNext() ) {
secCode = it.next();
System.out.println(currPriceMap.get(secCode));
System.out.println(pastPriceMap.get(secCode));
Move amove = new Move();
amove.setSecCode(secCode);
amove.setPrice(currPriceMap.get(secCode));
amove.setInitPrice(pastPriceMap.get(secCode));
topMoves.add(amove);
}
// while there are more lines while(scanner.hasNextLine()) { final String line; final String[] words; // get the next line line = scanner.nextLine(); // break the line up into the words (\\s+ should break it up via whitespace) words = line.split("\\s"); if(words.length != 5) { throw new WhateverExceptionMakesSense(line + " must contain 5 words"); } System.out.println(currPriceMap.get(words[0])); System.out.println(pastPriceMap.get(words[1])); Move amove = new Move(); amove.setSecCode(words[2]); amove.setPrice(currPriceMap.get(words[3])); amove.setInitPrice(pastPriceMap.get(words[4])); topMoves.add(amove); }