避免NPE的出现

作为一个经常看到NPE异常的人,我觉得有必要写一篇博客来总结遇到的问题和解决办法,希望借此能减少开发和上线时出现的问题。

什么是NPE

NPE: Null Pointer Exception
首先,null是一个关键字,和static和public一样,而且它是大小写敏感的。
其次,所有的基本类型都有默认值,比如int的默认值为0,Boolean的默认值为false,而null是任何引用类型的默认值。

null可以赋值给任何引用类型,也能被转化为任何引用类型。

怎么解决NPE

在这里贴一下外国大佬写的内容:java中导致空指针异常的常见原因。
一般是发生在两个值判断,调用方法和拆包的时候。

equals方法

在使用equals方法时,要注意,使用已知类型的对象去调用equals方法跟未知类型的对象作比较。如果将这两个对象反过来,就会出现空指针异常。

toString()和valueOf()方法

我们都会遇到需要讲一个Object类型的对象转化为String类型,这个时候我们通常有三种解决办法。一种是强制转换:(String)Object,这种方式是最常见的转换类型的方式,但是有一点需要注意的,那就是该对象必须可以被转换成String类型,不然就会报错抛出异常;一种是利用Object的toString()方法,但是当该对象是null的时候,就会报出空指针异常;最后一种是valueOf()方法,这个方法不会报出空指针异常,当该对象为null时,它会返回一个值为null的字符串,即:“null”,下面是valueOf方法的源码:

/**
     * Returns the string representation of the {@code Object} argument.
     *
     * @param   obj   an {@code Object}.
     * @return  if the argument is {@code null}, then a string equal to
     *          {@code "null"}; otherwise, the value of
     *          {@code obj.toString()} is returned.
     * @see     java.lang.Object#toString()
     */
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

但是在使用的时候一定要注意,它并不会返回一个null,而是一个"null"字符串。

使用工具类

其实已经有好多工具类都已经帮我们完成了判断是否为null的工作,比如apache的StringUtils类中的isEmpty()、isNotEmpty()、isBlank()等,我们可以在写代码的时候多使用这些方法来避免出现问题。

返回一个空的集合

当我们拿到的数据为null时,我们可以将它变为一个空的集合,比如:

List list = Collections.EMPTY_LIST;

通过这种方式返回的数据仍然可以调用size()等方法不会出错。

使用@NotNull和@Nullable

关于这两个注解的使用还没搞清楚,只知道可以使用@NotNull来判断传来的值是否为null,如果为空会报错,使用方法如下:

@NotNull(message = "姓名不能为空!")
private String personName;

也可以将注解加在参数中。

根据一定的规则设计类

我们可以在调用get方法时给该对象设置一个默认值,通过这样的方式我们可以避免出现空指针异常的问题。

数据库非空约束

给数据库中的字段加上非空约束,这样在查询记录的时候就不会报错了。

你可能感兴趣的:(java)