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;
}
War es hilfreich?

Lösung

Kurze Antwort:

Für jeden Aufruf von hasNext () sollte es nur ein Anruf auf next ()

sein

In 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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top