常见的空指针异常

断鸿 2019年07月13日 81次浏览

[toc]

自动拆箱导致的空指针

    /**
     * 自动拆箱引发的空指针,常见于状态比较
     */
    @Test
    public void unBoxing() {

        Integer a = 99;//自动装箱 等价于 Integer.valueOf(99)
        int b = a;//自动拆箱 等价于 a.intValue()

        Integer c = null;
        int d = c;//NPE

        if (c == d) {
            //do something
        }
    }

级联调用

    /**
     * 级联调用:集合取元素后直接操作、对象未判空调用toString方法(Long、Integer等)
     */
    @Test
    public void cascade() {
        @Getter
        class User {
            private String name;
        }

        List<User> userList = Arrays.asList(new User(), new User());
        if (!CollectionUtils.isEmpty(userList)) {
            for (User user : userList) {
                if (user.getName().contains("tom")) {
                    //do something
                }
            }
        }
      
        //List中的空对象
        List<User> userList1 = Arrays.asList(null);
        for (User user : userList1) {
            System.out.println(user.getName());
        }
    }

字符串转换

    @Test
    public void tanslate() {
      	Integer i = null;
        String.valueOf(i);
    }

字符串判等

    /**
     * 字符串判等
     */
    @Test
    public void equals() {
        String str = null;

        if ("abc".equals(str)) {
            //do something
        }

        if (str.equals("abc")) {
            //do something
        }

    }

Map添加元素时的空指针

    /**
     * map添加元素时的空指针异常
     */
    @Test
    public void map() {

        Map hashMap = new HashMap();
        hashMap.put(null, "a");
        hashMap.put("a", null);

        Map treeMap = new TreeMap();
//        treeMap.put(null, "b");//NPE
        treeMap.put("b", null);

        Map concurrentMap = new ConcurrentHashMap();
//        concurrentMap.put(null, "c");//NPE
//        concurrentMap.put("c", null);//NPE
    }