主页 > 知识库 > 网络编程 > JSP/Java >

Java自动拆箱的一个小纰漏

来源:中国IT实验室 作者:佚名 发表于:2013-03-29 14:45  点击:
自从有了范型,Java的容器操作便利了不少,但因为还存在int,float这里原始数据类型而磨合得还不够好. 例如下面的这个小例子: MapString,Integer map=new HashMapString,Integer(); map.put(1,1); System.out.println(map.get(2)); 实际上map中并没有键为2的值,
自从有了范型,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来表示,但不存在的数字在Java中 却没有对应的表示(例如Ruby中就有NAN,表示这不是一个数字)。乍看之下好像也没什么大不了,但是这样的小缺陷使得在Java编程中想像一般类型一 样的来使用数字和容器变得不太可能,如果用一个容器来做数字的存取,则只能在取之前很小心的先查看使用的键值对是否已经在容器中,而不能像一般对象的存取 那样,直接取出,通过结果来判断罢了。
  发现这个小纰漏仅在偶然间,JDK的文档我看得不多,也许SUN的工程师早就在哪里提醒过大家了吧,只是我孤陋寡闻而已,大家看着玩玩。

    有帮助
    (0)
    0%
    没帮助
    (0)
    0%