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.本文参考博客园的文章