Java 但我打印了元素并得到了预期的结果

Java 但我打印了元素并得到了预期的结果,java,exception,vector,logic,Java,Exception,Vector,Logic,我要做的是将一个移动对象保存到一个名为topMoves的向量中。将有许多移动对象,这就是我在循环中创建对象的原因 pastPriceMap存储过去某个时间(在本例中为一分钟前)的股票价格。currPriceMap存储最后一秒钟内某个时间段的股票价格 我得到以下例外情况: 线程“Timer-0”java.util.NoSuchElementException中出现异常 这是导致问题的线路: setInitPrice(passpricemap.get(iter.next()) 下面是代码片段。当我执

我要做的是将一个移动对象保存到一个名为topMoves的向量中。将有许多移动对象,这就是我在循环中创建对象的原因

pastPriceMap存储过去某个时间(在本例中为一分钟前)的股票价格。currPriceMap存储最后一秒钟内某个时间段的股票价格

我得到以下例外情况:

线程“Timer-0”java.util.NoSuchElementException中出现异常

这是导致问题的线路: setInitPrice(passpricemap.get(iter.next())

下面是代码片段。当我执行System.out.println语句时,我得到了预期的输出:

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;
//虽然有更多的线 while(scanner.hasNextLine()) { 最后一根弦线; 最后的字符串[]个单词; //接下一行 line=scanner.nextLine(); //将该行拆分为单词(\\s+应通过空格将其拆分) 文字=行分割(\\s); 如果(单词长度!=5) { 抛出新WhateverExceptionMakesSense(行+“必须包含5个单词”); } System.out.println(currPriceMap.get(words[0]); System.out.println(passpricemap.get(words[1]); Move amove=新移动(); amove.setSecCode(字[2]); amove.setPrice(currPriceMap.get(words[3]); amove.setInitPrice(passpricemap.get(words[4]); topMoves.add(amove); } //虽然有更多的线 while(scanner.hasNextLine()) { 最后一根弦线; 最后的字符串[]个单词; //接下一行 line=scanner.nextLine(); //将该行拆分为单词(\\s+应通过空格将其拆分) 文字=行分割(\\s); 如果(单词长度!=5) { 抛出新WhateverExceptionMakesSense(行+“必须包含5个单词”); } System.out.println(currPriceMap.get(words[0]); System.out.println(passpricemap.get(words[1]); Move amove=新移动(); amove.setSecCode(字[2]); amove.setPrice(currPriceMap.get(words[3]); amove.setInitPrice(passpricemap.get(words[4]); topMoves.add(amove); } 简短答复:

对于hasNext()的每个调用,应该只有一个调用next()

在代码中有5个next(),只有一个hasNext()

在这里,请阅读以下内容:

编辑

详细回答:

基本上,迭代器用于。。。我们可以迭代“something”的元素,特别是一个集合,但它可以是任何东西(假定任何东西都返回一个迭代器)

由于您可能不知道“任何东西”有多少个元素,因此必须有一种停止迭代的方法,对吗?(如果是数组,可以通过length属性来判断,但迭代器用于“封装”实现中使用的数据结构)

迭代器API定义了这两种方法

-hasNext(): boolean 
-next(): Object ( or <E> since Java 1.5 ) 
如果迭代器只有两个项,会发生什么

 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.

}
这就是发生在你身上的事情。您没有验证迭代器是否有其他元素,您只是检索它。如果迭代器碰巧有一些元素,它可能会工作一段时间,但会有一段时间(正如您刚才看到的)失败

顺便说一下,甚至在捕捉非接触性异常时都不要思考。这是一个运行时异常,它指示应该修复代码逻辑中的某些内容

有关例外情况的详细信息,请参阅。

简短回答:

对于hasNext()的每个调用,应该只有一个调用next()

在代码中有5个next(),只有一个hasNext()

在这里,请阅读以下内容:

编辑

详细回答:

基本上,迭代器用于。。。我们可以迭代“something”的元素,特别是一个集合,但它可以是任何东西(假定任何东西都返回一个迭代器)

由于您可能不知道“任何东西”有多少个元素,因此必须有一种停止迭代的方法,对吗?(如果是数组,可以通过length属性来判断,但迭代器用于“封装”实现中使用的数据结构)

迭代器API定义了这两种方法

-hasNext(): boolean 
-next(): Object ( or <E> since Java 1.5 ) 
如果迭代器只有两个项,会发生什么

 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.

}
这就是发生在你身上的事情。您没有验证迭代器是否有其他元素,您只是检索它。如果迭代器碰巧有一些元素,它可能会工作一段时间,但会有一段时间(正如您刚才看到的)失败

顺便说一下,甚至在捕捉非接触性异常时都不要思考。这是一个运行时异常,它指示应该修复代码逻辑中的某些内容


请参阅以了解有关异常的更多信息。

以下是使用新for循环的版本:

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);
}
以旧的方式:

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);
 }
String secCode=null;
for(Iterator it=secCodeList.Iterator();it.hasNext()){
secCode=it.next();
System.out.println(currPriceMap.get(secCode));
System.out.println(passpricemap.get(secCode));
Move amove=新移动();
amove.setSecCode(secCode);
amove.setPrice(currPriceMap.get(secCode));
setInitPrice(passpricemap.get(secCode));
topMoves.add(amove);
}

以下是使用新for循环的版本:

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);
}
以旧的方式:

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);
 }
String secCode=null;
for(Iterator it=secCodeList.Iterator();it.hasNext()){
secCode=it.next();
System.out.println(currPriceMap.get(secCode));
System.out.println(passpricemap.get(secCode));
Move amove=新移动();
amove.setSecCode(secCode);
amove.setPrice(currPriceMap.get(secCode));
setInitPrice(passpricemap.get(secCode));
topMoves.add(amove);
}

谢谢。将iter.next()替换为secCodeIter并定义字符串secCodeIter=iter.next(),谢谢。将iter.next()替换为secCodeIter并定义了字符串secCodeI