【Java自动拆箱的一个小纰漏】

来源:互联网 发布:mac usb没反应 编辑:程序博客网 时间:2024/04/30 05:09
自从有了范型,Java的容器操作便利了不少,但因为还存在int,float这里原始数据类型而磨合得还不够好.

  例如下面的这个小例子:

  Map<String,Integer> map=new HashMap<String,Integer>();

  map.put("1",1);

  System.out.println(map.get("2"));

  实际上map中并没有键为"2"的值,不过代码运行正常,输出为

  null

  现在来做一点小改动,

  Map<String,Integer> map=new HashMap<String,Integer>();

  map.put("1",1);

  int i=map.get("2");

  System.out.println(i);

  注意到只是用中间变量i暂时存放了一下取出的值,这个时候就会报错啦:

  Exception in thread "main" java.lang.NullPointerException

  仔细想想倒也觉得错得在理,因为不存在的对象可以以null来表示,但不存在windows xp系统下载的数字在Java中却没有对应的表示(例如Ruby中就有NAN,表示这不是一个数字)。乍看之下好像也没什么大不了,但是这样的小缺陷使得在Java编程中想像一般类型一样的来使用数字和容器变得不太可能,如果用一个容器来做数字的存取,则只能在取之前很小心的先查看使用的键值对是否已经在容器中,而不能像一般对象的存取那样,直接取出,通过结果来判断罢了。

 

  发现这个小纰漏仅在偶然间,JDK的文档我看得不多,也许SUN的工程师早就在哪里提醒过大家了吧,只是我孤陋寡闻而已,大家看着玩玩。