说说JDK中的String.valueOf(null)?第一次遇到

1.第一次遇到的是时候 死活不理解为什么?

String valueOf = String.valueOf(map.get("fkfs"));
if (valueOf != null ) {
        order.setFkfs(PayStyle.valueOf(String.valueOf(map.get("fkfs"))));// 取值
 }

代码 map.get("fkfs") 取出来是null

转换为下面的

Object obj = null;
if(String.valueOf(obj)!=null){
   //肯定会走到这里面来
 System.out.println(String.valueOf(obj));
}

System.out.println(String.valueOf(null));//抛异常

2.第一个输出“null”,没错,不是空对象null也不是空串“”,而是一个字符串!!包含四个字母n-u-l-l的字符串,但是,第二个输出,抛空指针异常了。

 /**
 2      * Returns the string representation of the <code>Object</code> argument.
 3      *
 4      * @param   obj   an <code>Object</code>.
 5      * @return  if the argument is <code>null</code>, then a string equal to
 6      *          <code>"null"</code>; otherwise, the value of
 7      *          <code>obj.toString()</code> is returned.
 8      * @see     java.lang.Object#toString()
 9      */
10     public static String valueOf(Object obj) {
11     return (obj == null) ? "null" : obj.toString();
12     }

很简单的说法 如果对象为空,就返回字符串的"null" 不为空就调用toString方法。

3.

再来说第二个:

第二个和第一个的不同,是java对重载的不同处理导致的。

基本类型不能接受null入参,所以接受入参的是对象类型,如下两个:

String valueOf(Object obj)

String valueOf(char data[])

这两个都能接受null入参,这种情况下,java的重载会选取其中更精确的一个,所谓精确就是,重载方法A和B,如果方法A的入参是B的入参的子集,则,A比B更精确,重载就会选择A。换成上面这两个就是,char[]入参的比object的更精确,因为object包含char[],所以String.valueOf(null)是用char[]入参这个重载方法。

下面看这个方法:

/**
 2      * Returns the string representation of the <code>char</code> array
 3      * argument. The contents of the character array are copied; subsequent
 4      * modification of the character array does not affect the newly
 5      * created string.
 6      *
 7      * @param   data   a <code>char</code> array.
 8      * @return  a newly allocated string representing the same sequence of
 9      *          characters contained in the character array argument.
10      */
11     public static String valueOf(char data[]) {
12     return new String(data);
13     }

4.上面是 直 接new String的,再看new String的实现:

 1     /**
 2      * Allocates a new {@code String} so that it represents the sequence of
 3      * characters currently contained in the character array argument. The
 4      * contents of the character array are copied; subsequent modification of
 5      * the character array does not affect the newly created string.
 6      *
 7      * @param  value
 8      *         The initial value of the string
 9      */
10     public String(char value[]) {
11     this.offset = 0;
12     this.count = value.length;
13     this.value = StringValue.from(value);
14     }

那么上面的代码第12行就会报异常了,所以的话不能传入参数null;

希望遇到此现象的人别再迷途

 

5.本文参考博客园的文章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值