2017-11-14 4 views
-1

Mein Code wie folgt aus:java.util.NoSuchElementException während Arraylist von HashMap immer geht mit Iterator

HashMap<Integer, ArrayList<DebtCollectionReport>> mapOfAccounts = new HashMap<Integer, ArrayList<DebtCollectionReport>>(); 
    Set<String> agencyNames = agencyWiseAccountMap.keySet(); 
    Iterator iter = agencyNames.iterator(); 
    while (iter.hasNext()) { 
    String agency = (String) iter.next(); 
    HashMap<Integer, ArrayList<DebtCollectionReport>> tempAccountsMap = agencyWiseAccountMap.get(agency); 
    Set<Integer> accountSet = tempAccountsMap.keySet(); 
    Iterator itr = accountSet.iterator(); 
    while (itr.hasNext()) { 
     mapOfAccounts.put((Integer) itr.next(), tempAccountsMap.get((Integer) itr.next())); 
    } 
    } 

Ich erhalte Ausnahme Spur:

>

java.util.NoSuchElementException 
    at java.util.HashMap$HashIterator.nextNode(Unknown Source) 
    at java.util.HashMap$KeyIterator.next(Unknown Source) 
    at com.cerillion.debtcollection.collector.CollectionExecutor.execute(CollectionExecutor.java:56) 
    at com.cerillion.debtcollection.collector.CollectionExecutor.main(CollectionExecutor.java:24) 
2017-11-14 05:00:43,733 ERROR CollectionExecutor    [main  ] Exception occurred while executing Debt Collection java.util.NoSuchElementException 
java.util.NoSuchElementException 
    at java.util.HashMap$HashIterator.nextNode(Unknown Source) 
    at java.util.HashMap$KeyIterator.next(Unknown Source) 
    at com.cerillion.debtcollection.collector.CollectionExecutor.execute(CollectionExecutor.java:56) 
    at com.cerillion.debtcollection.collector.CollectionExecutor.main(CollectionExecutor.java:24) 

Dies wird vorkommendes für Linie:

mapOfAccounts.put((Integer) itr.next(), tempAccountsMap.get((Integer) itr.next())); 

Was kann der mögliche Grund sein und wie kann ich es lösen?

Antwort

1

Im folgenden Codeblock haben Sie einmal hasNext() aufgerufen, aber Sie haben next() zweimal aufgerufen. hasNext() gibt true zurück, wenn Iteration mehr Werte hat und next() gibt das nächste Element in Iteration

while (itr.hasNext()) { 
    mapOfAccounts.put((Integer) itr.next(), tempAccountsMap.get((Integer) itr.next())); 
} 

Sie diese Zeile entsprechend ändern können:

while (itr.hasNext()) { 
    Integer i1 = (Integer) itr.next(); 
    if(itr.hasNext()){ 
    mapOfAccounts.put(i1, tempAccountsMap.get((Integer) itr.next())); 
    } 
} 
+0

Vielen Dank. Es funktioniert jetzt gut. –

0
mapOfAccounts.put((Integer) itr.next(), tempAccountsMap.get((Integer) itr.next())); 

Das Problem mit itr.next() sein sollte, jedes Mal, Sie haben aufgerufen, der Index des Iterators würde einen Schritt vorwärts gehen. So ist der Code Schritt 2 Schritte in dieser Linie ... Sie mit einem var sollte den Wert zu akzeptieren, dann verwenden Sie die var:

int accountIdTemp = itr.next(); 
mapOfAccounts.put((Integer) accountIdTemp , tempAccountsMap.get((Integer) accountIdTemp)); 

Hope this Hilfe.

Verwandte Themen