空指针异常处理

  • Post author:
  • Post category:其他




1.对象判断空


java.util.Objects

    @Test
    public void test01(){
        Object object = null;
        System.out.println(Objects.isNull(object));//true
        System.out.println(Objects.nonNull(object)); //false
        //Objects.requireNonNull(object,"该对象不能为空");//java.lang.NullPointerException: 该对象不能为空
        object = 1;
        Object requireNonNull = Objects.requireNonNull(object, "不能为空");//不为空的话会返回当前对象,这里返回Integer 值为1
        System.out.println();
    }



2.字符串判断空


org.apache.commons.lang3.StringUtils

    @Test
    public void test02(){
        String s1 = null;
        String s2 = "";
        String s3 = " ";
        //  StringUtils.isEmpty  字符串对象是否为空且长度为0 仅有空格的话有长度 会判断为不为空
        System.out.println(StringUtils.isEmpty(s1)); //true
        System.out.println(StringUtils.isEmpty(s2)); //true
        System.out.println(StringUtils.isEmpty(s3)); //false
        System.out.println(s3.length());
        // isNotEmpty 和isEmpty 校验结果相反

        // StringUtils.isBlank、StringUtils.isNotBlank 会将字符串开头,结尾的空格去掉之后,判断长度是否大于0
        System.out.println(StringUtils.isBlank(s3)); //这条会变为true

        //字符串比较 要将常量放到前面
        //if ("ehang".equals(name))
    }



3.集合判断为空

Map、List、Set 是经常会用到的数据结构,虽然他们都包含有isEmpty()方法,能判断容器中是否包含了元素,但是无法判断自生对象是否为空,一旦对象没有实例化时,调用isEmpty()就会报空指针异常;Spring 为我们提供了一个

org.springframework.util.CollectionUtils

工具类,其中的isEmpty就会优先判断对象是否为空,然后再通过isEmpty()判断是否存在元素,能大大减少因为对象为空带来的空指针异常;

    @Test
    public void test03(){
        Map map = null;
        //System.out.println(map.isEmpty()); // 空指针异常
        System.out.println(CollectionUtils.isEmpty(map)); // true
        map = new HashMap();
        System.out.println(map.isEmpty()); // true
        System.out.println(CollectionUtils.isEmpty(map)); // true
        map.put("1", "2");
        System.out.println(CollectionUtils.isEmpty(map)); // false
        System.out.println(map.isEmpty()); // false

        List list = null;
        //System.out.println(list.isEmpty()); // 空指针异常
        System.out.println(CollectionUtils.isEmpty(list)); // true
        list = new ArrayList();
        System.out.println(list.isEmpty()); // true
        System.out.println(CollectionUtils.isEmpty(list)); // true
        list.add("1");
        System.out.println(CollectionUtils.isEmpty(list)); // false
        System.out.println(list.isEmpty()); // false

        Set set = null;
        //System.out.println(set.isEmpty()); // 空指针异常
        System.out.println(CollectionUtils.isEmpty(set)); // true
        set = new TreeSet();
        System.out.println(set.isEmpty()); // true
        System.out.println(CollectionUtils.isEmpty(set)); // true
        set.add("1");
        System.out.println(CollectionUtils.isEmpty(set)); // false
        System.out.println(set.isEmpty()); // false
    }



4.赋初值 不要返回null

		//当定于局部变量,定义对象的属性时,能赋初始值的就尽量带上初始值;
        Map map = new HashMap();
        Integer integer =0;
		//当方法有返回值的时候,非必要的情况下,尽量不要返回null;
        Collections.emptyList(); //比如返回list 如果要返回空list 可以这样返回 而不是返回null



5.局部变量使用基本数据类型

    public void test04(){
        int x;
        Integer y;
        //System.out.println( x + 1 );  // 编译失败
        //System.out.println( y + 1 );  // 编译失败

        int i = 1;
        Integer j = null;
        System.out.println( i + 1 );  // 正常
        System.out.println( j + 1 );  // 空指针异常
        int m = i; // 正常
        int n = j; // 空指针异常
    }

当变量x、y 只定义、不赋值的时候,x + 1 和 y + 1 是没办法通过编译的;**而包装类 j 指定为null对象,当包装类参与运算的时候,首先会做拆箱操作,也就是调用 intValue() 方法,由于对象是空的,调用方法自然就会报空指针;同时,将一个包装类赋值给一个基本数据类型时,同样也会做拆箱操作,自然也就空指针异常了;**但是,基本数据类型就必须指定一个具体值,后续不管运算、还是赋值操作,都不会出现空指针异常;



6.断言

Assert 用来断定某一个实际的运行值和预期项是否一致,所以他和其他工具类的校验方式是反着在;

比如isNull方法是期望对象为null,如果不为空的时候,就会报错;notNull表示期望对象不为空,当对象为空时,就会报错;

正常使用时需要处理这个异常

    @Test
    public void test06(){
        Integer i1 =null;
        Assert.notNull(i1,"不能为空"); //java.lang.IllegalArgumentException: 不能为空
    }



7.optional



版权声明:本文为weixin_46666822原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。