洛阳北大青鸟:Java自动拆箱的一个小纰漏 你注意到了吗?
自从有了范型,Java的容器操作便利了不少,但因为还存在int,float这里原始数据类型而磨合得还不够好.
例如下面的这个小例子:
Map map=new HashMap();
map.put("1",1);
System.out.println(map.get("2"));
实际上map中并没有键为"2"的值,不过代码运行正常,输出为
null
现在来做一点小改动,
Map map=new HashMap();
map.put("1",1);
int i=map.get("2");
System.out.println(i);
注意到只是用中间变量i暂时存放了一下取出的值,这个时候就会报错啦:Exception in thread "main" java.lang.NullPointerException
仔细想想倒也觉得错得在理,因为不存在的对象可以以null来表示,但不存在的数字在Java中却没有对应的表示(例如Ruby中就有NAN,表示这不是一个数字)。乍看之下好像也没什么大不了,但是这样的小缺陷使得在Java编程中想像一般类型一样的来使用数字和容器变得不太可能,如果用一个容器来做数字的存取,则只能在取之前很小心的先查看使用的键值对是否已经在容器中,而不能像一般对象的存取那样,直接取出,通过结果来判断罢了。
发现这个小纰漏仅在偶然间,JDK的文档我看得不多,也许SUN的工程师早就在哪里提醒过大家了吧,只是我孤陋寡闻而已,大家看着玩玩。