黑马程序员技术交流社区

标题: 关于Map集合代码简写后出异常 [打印本页]

作者: 明月几时有    时间: 2013-11-13 23:52
标题: 关于Map集合代码简写后出异常
本帖最后由 明月几时有 于 2013-11-15 01:14 编辑

package cn.itcast.eclipse;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Demo2 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                Map<String, String>hs=new HashMap<String,String>();
                hs.put("01", "zhangsan");
                hs.put("02", "lisi");
                hs.put("03", "wangwu");
                Set<Map.Entry<String, String>> s=hs.entrySet();
                Iterator<Map.Entry<String, String>>it=s.iterator();
                while(it.hasNext()){
                        Map.Entry<String, String> me=it.next();
                        String key=me.getKey();                               
                        String value=me.getValue();       
                        //String key=it.next().getKey();//把上面三句代码简写成这两句,运行会出异常,不解,求指点!
                        //String value=it.next().getValue();
                        System.out.println(key+" : "+value);
                }
        }
}



作者: qw无语    时间: 2013-11-14 00:22
本帖最后由 qw无语 于 2013-11-14 00:29 编辑

楼下说的对,我说错了....

作者: 起猿    时间: 2013-11-14 00:23
楼主抛出的异常时没有这个元素异常:java.util.NoSuchElementException

不知道楼主有没有发现,在异常的上面,还输出了一个:01 : lisi
而对应你的代码来看,你的01键对应的值是zhangsan 而与lisi这个值对应的键是02

这里就需要了解Iterator接口中next()这个方法的作用
这个方法是:返回迭代的下一个元素。

在你注释的代码中,第一句String key=it.next().getKey();调用了一次next(),此时得到的键是01

而在你的下一句代码中,String value=it.next().getValue();这里又调用了一次next(),千万不要认为两个代码只用了一次next()方法

所以,你的第二次调用,将会使指针指向下一个元素。所以这个打印的值是lisi

而当你继续循环的时候,继续调用第一句的next()方法,这时String key=it.next().getKey();这个语句得到的键是03.

而由于没有输出语句,所以这个键没有输出。接下来程序走到下一句代码中String value=it.next().getValue();这个next()方法

将使指针继续向后移动,而你要知道,你得到上面的键03的时候,已经是最后一个元素了。所以继续向后寻找,将找不到任何元素。

所以系统在打印出01:lisi 之后,抛出异常java.util.NoSuchElementException

希望能看懂,不懂再问我。

作者: 明月几时有    时间: 2013-11-14 02:18
起猿 发表于 2013-11-14 00:23
楼主抛出的异常时没有这个元素异常:java.util.NoSuchElementException

不知道楼主有没有发现,在异常的上 ...

太感谢你啦,回答的真好,还运行了代码,我看懂了,我的两个it.next()不是同步的
作者: 起猿    时间: 2013-11-14 20:49
明月几时有 发表于 2013-11-14 02:18
太感谢你啦,回答的真好,还运行了代码,我看懂了,我的两个it.next()不是同步的 ...

嘿嘿,可惜没有分呀
作者: 何超    时间: 2013-11-14 23:48
起猿 发表于 2013-11-14 20:49
嘿嘿,可惜没有分呀

擦 为嘛没分···回答挺好的啊
作者: FFF    时间: 2013-11-14 23:51
起猿 发表于 2013-11-14 20:49
嘿嘿,可惜没有分呀

淡定~昨晚都在听课呢~可能版主没有看到,我现在给你加上!
作者: 起猿    时间: 2013-11-15 00:10
FFF 发表于 2013-11-14 23:51
淡定~昨晚都在听课呢~可能版主没有看到,我现在给你加上!

特别淡定,一没分就感觉自己回答的错误,就赶紧查阅相关知识点。嘿嘿
作者: 明月几时有    时间: 2013-11-15 01:12
FFF 发表于 2013-11-14 23:51
淡定~昨晚都在听课呢~可能版主没有看到,我现在给你加上!

大快人心,我就知道一定是版主太忙了,没看到:lol
作者: 明月几时有    时间: 2013-11-15 01:13
起猿 发表于 2013-11-15 00:10
特别淡定,一没分就感觉自己回答的错误,就赶紧查阅相关知识点。嘿嘿

这下有了吧,你答的那么好,看到没给分,我都惭愧了:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2