Integer a=null;
简单问下为什么
String.valueOf(a);//不报错
a.toString();//会报错
1.既然a在上面能看成Integer,为什么这里不能看成Integer
是因为null不是Object的子类,不能调用.toString()方法吗,还是别的什么原因,望指教
2.还有发现如果赋予某引用类型空值的话,它就不是Object实例了。
例如上面的a instanceof Object返回false,虽然我知道null不是任何引用类型的实例,但不能将a看成Integer类型吗
如果不能的话,那么为什么String.valueOf(a)又正确了呢,有点奇怪

解决方案 »

  1.   

    Java是不会为null分配内存的,也就是上面的a没有指向任何内存地址
    这就是为什么a.toString()会报空指针
    String.valueOf(a)不会报错 但是返回的也是null
    我个人感觉在a==null的话就不算Integer
    听听别人的看法
      

  2.   

    给方法传递参数实质上是一种赋值行为,即将实参赋值给形参变量,null当然是可以接受的,因为你可以给任何引用类型变量赋null值。
    而在一个引用变量上调用实例方法(或访问其实例变量),则首先需要该变量指向一个对象实例,因为无论是调用成员方法还是访问成员变量,Java都必须知道某个具体实例的内存地址,null不代表任何实例,当然不可接受的。但是,指向null的变量,仍然可以调用其静态方法(或访问其静态变量),因为这时Java不需要一个具体的实例,只需要有类对象存在即可。如:
    Integer a = null;
    a.toString(100); // 这里的toString()是Integer类的静态方法
      

  3.   

    个人解释:
    Integer a = null;
    首先你声明了一个Integer引用,此时你并没有将a指向Integer对象,而是将null赋给a ;
    null在内存中有个特殊的空间,而这个特殊的空间是空的. 所以a无法调用任何方法,
    而String.valueOf(a); valueOf是String类里的静态方法,你可以传一个空的Integer引用
    作为参数,因为valueOf方法里有判断传过来的参数是否是null的,然后对null的参数处理。如果你是Integer a = new Integer(0);
    那么首先你堆里面创建了一个对象后(中间细节略),返回该对象的地址给Integer引用a.
    当你调用a.toString(),首先通过a找到a所指向的对象,然后再通过该对象到代码区找到是否
    有toString这个方法没,没有则报错。
      

  4.   

    你点一下valueOf,看看它的实现,就知道为什么会出空指针了~
      

  5.   

    原因很简单,String.valueOf()是一个静态方法,它会对输入参数进行检查。
    而a.toString()是对对象的方法进行调用,a都没有实例,当然报空指针错误。
      

  6.   

    调用toString()方法,将返回一个代表有关当前对象本身信息的字符串。
    默认情况下,返回的字符串有该对象所属的类名,“@”和代表该对象的无符号16进制数(一般是对象所在的内存地址组成)一般情况下,Object类中的toString()方法默认返回的字符串没有什么实用价值,其子类需要覆盖这个方法,使它返回一个代表该对象易懂的串。每个包装类中带有toString(value)方法
    System.out.println(Integer.toString(200));
      

  7.   

    看了大家的答案,首先谢谢大家的回复,综合2楼的朋友,总结了下
    1.首先传递参数是个赋值的过程,也就是说如果对任何引用变量传递为null的对象的话,都是可以接受的,也就是编译的时候不会出错,但运行时出不出错就要具体情况具体分析了,如果出错那肯定是传空指针异常。
    例如同样是static方法,同样是传递参数,但是static String copyValueOf(char[] data)
    会报错。至于为什么会报错就要看源代码了。
    2.还有就是在如果要调用一个类的成员方法或变量,那你必须要有他的实例,因为java要知道某个实例的具体内存地址,除非是调用静态方法或变量。虽然某类型变量的实例的指向null,但他还是能够代表该类的,所以肯定能调用静态方法。
      

  8.   

    首先Integer a = null;对引用a的任何操作都会报空指针异常
    而String.valueOf(a);是将a作为valueOf方法的参数,你可以查看jdk的src,应该是对null进行处理了。直接返回的是字符串"null"
      

  9.   

    其实这样的问题没有必要去问......这就相当于语法,程序都是程序员写的....JDK也不例外啊.............没准....我SUN公司哪天高兴了...给你来个反的.....