判断非String对象是否为null,小伙竟然用StringUtils.isEmpty(obj+"")

发布时间 2023-06-05 15:02:00作者: buguge

我在代码走查时,发现下面的代码。其中Line133行的StringUtils.isEmpty(levyId+"")引起了我的注意。levyId是Long,你这样判断Long是否为null,能行吗?

 

 

答案是:不行!

当levyId是null时,levyId+""的值是什么? 是字符串null哟~~ 显然,StringUtils.isEmpty("null") 是false。所以,还是老老实实地用 levyId==null来判断对象是否为null吧。

 

那么,为什么levyId+""在levyId是null时的值是字符串null?

 

在Java中,当你对一个对象使用加号 "+" 进行字符串连接时,实际上是先调用了String#valueOf方法将对象转换为字符串。

走,带你去java.lang.String看看它的静态成员valueOf方法。可以看到,valueOf有许多重载,除了valueOf(Object)以为,其他重载都是基于int/long/char/boolean等基本类型参数的。

 

对于非基本类型,即应用类型对象,就要注意valueOf(Object)了。来看看这个方法的实现。此刻,你应该知道为什么levyId+""当levyId为null时的值是字符串null了吧!

// in java.lang.String

    /**
     * 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();
    }

 

 

下面是与ChatGPT的对话,它对这个知识点的回答并不能令我满意。anyway,我为全世界的程序员出了一把力,训练了一下AI大脑。