valueOf的源码是
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
可是为什么
if(String.valueOf(null).equals("null") ){
    System.out.println("ss");
}
报空指针异常?

解决方案 »

  1.   

    public class Test{
        public static void main(String args[]){
         Object o = null;
         if(String.valueOf(o).equals("null") ){
           System.out.println("ss");
         }
         if(null instanceof Object)
         System.out.println("true");
         else
         System.out.println("false");
        }
    }
    我这么理解的,String valueOf(Object obj),注意它的参数是Object类型,而null不是Object类型,所以报空指针异常
      

  2.   

    String.valueOf(null) = null,既然是null,那还能.equals()吗?
      

  3.   

    我也去试了代码.异常是出现在
        public String(char value[]) {
    int size = value.length;//这行
    this.offset = 0;
    this.count = size;
    this.value = Arrays.copyOf(value, size);
        }
    二楼的说法,总觉得说不过去..理解不了.api这样说的返回:
    如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
      

  4.   

    源码中很清楚说了,返回String类 "null"
      

  5.   


    同意,.equals()是比较是否具有相同的引用,既然是null了,根本就没任何引用,肯定报异常
      

  6.   

    equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
    ==用于比较引用和比较基本数据类型时具有不同的功能:
    比较基本数据类型,如果两个值相同,则结果为true 
    而在比较引用时,如果引用指向内存中的同一对象,结果为true
      

  7.   

    你说valueOf的源码,这里用的String.valueOf还是java.lang.String的原生方法吧?
    原生方法必然空指针
      

  8.   

    这里应该是java.lang.String,此异常貌似和public static String valueOf(Object obj)是静态方法有关,大家怎么看呢?
      

  9.   

    就是根本没用到你这个方法
    public static String valueOf(Object obj) {
      return (obj == null) ? "null" : obj.toString();
    }
      

  10.   

    如果没用到那个方法的话,那么valueOf的对参数的处理是怎样的?
      

  11.   

    三楼提到过~public static String valueOf(char data[]) {
        return new String(data);
    }
      |
      V
    public String(char value[]) {
        int size = value.length;
        this.offset = 0;
        this.count = size;
        this.value = Arrays.copyOf(value, size);
    }value为空导致异常
      

  12.   

    null在Java里是一个“神奇”的对象,既不是任何对象,又可以被强转为任何对象Java编译器在处理函数调用时,会使用尽量精确的函数定义
    查看String.valueOf函数
    发现有个N个.排除基本类型为参数的及参数个数不一致的同名函数
    只留下2个函数
    String.valueOf(Object o)
    String.valueOf(char[] data)
    显然后者比前者更精确。因此编译器认为String.valueOf(null)调用的是后者.
    而后者又调用 new String(char[])
    so 空指针了
      

  13.   

    如1楼提到的代码
    如果你是对一个变量调用其String.valueOf函数,则编译器取其字面类型。
    除了被声明为char[]类型的null外,其它类型的null,其valueOf都返回"null"
      

  14.   

    public String(char value[]) {
      int size = value.length;
      this.offset = 0;
      this.count = size;
      this.value = Arrays.copyOf(value, size);
    }
    这段代码是从哪来的?
      

  15.   

    我的jdk api 1.60没看到有源码可以看啊?
      

  16.   

    函数重载的问题!!!!
    null在Java里是一个“神奇”的对象,既不是任何对象,又可以被强转为任何对象Java编译器在处理函数调用时,会使用尽量精确的函数定义
    查看String.valueOf函数
    发现有个N个.排除基本类型为参数的及参数个数不一致的同名函数
    只留下2个函数
    String.valueOf(Object o)
    String.valueOf(char[] data)
    显然后者比前者更精确。因此编译器认为String.valueOf(null)调用的是后者.
    而后者又调用 new String(char[])
    so 空指针了
    equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
    ==用于比较引用和比较基本数据类型时具有不同的功能:
    比较基本数据类型,如果两个值相同,则结果为true  
    而在比较引用时,如果引用指向内存中的同一对象,结果为true