public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

以上会报空指针异常;而下面这样就可以打印 null。

 Object obj = null;
System.out.println(String.valueOf(obj));

这种方式能正常运行,原因如下:debug 代码会发现,两种方式执行了不同的重载方法,第一种执行了以下方法

 public static String valueOf(char data[]) {
return new String(data);
}

第二种执行了以下方法,

 public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

如果对重载不熟悉,很难解释其中原因;当然null是另一个让人头疼的问题,

重载

Java 的重载解析过程是以两阶段运行的:

  • 第一阶段:选取所有可获得并且可应用的方法或构造器。
  • 第二阶段:在第一阶段选取的方法或构造器中选取最精确的一个,如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。

java.lang.String 中 valueOf() 所有重载方法

 static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(char[] data)
static String valueOf(char[] data, int offset, int count)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(Object obj)

因为基本类型不能赋值 null,String.valueOf(null) 只能匹配 valueOf(char[] data) 和  valueOf(Object obj);而 valueOf(char data[])更精确,所以选择执行  valueOf(char data[])

再看一个例子:

 public static void hah(Integer i) {
System.out.println(i);
} public static void hah(Long l) {
System.out.println(l);
} private static void hah(Object o){
System.out.println(o);
}

null

null 有类型吗?null 是一个值还是一个对象?

我们知道若instanceof左边为null,那么不论右边是什么类,直接返回 false;至少可以知道 null 不是对象;其实执行valueOf(char[] data)方法也证明了这点。

null 有类型吗?null 是一个值还是一个对象?

我们知道若instanceof左边为null,那么不论右边是什么类,直接返回 false;至少可以知道 null 不是对象;其实执行valueOf(char[] data)方法也证明了这点。

 System.out.println(String.valueOf((Integer)null));

null 造成的NullPointerException大概是最常见的异常,不论是 JDK 还是第三方类库都做了很多工作尽可能的避免空指针异常;比如 Apache Commons 的 collections、lang 判空,Guava 的 Optional 等;甚至 Optional 类已经成为 Java 8 类库的一部分。

或许,大家认为这两段代码都会抛出空指针异常;其实,第二段代码会正常执行。

hah() 方法是上面例子中定义的方法,它用 static 修饰是静态方法;对于静态方法和静态变量,使用了静态绑定,并不会抛出空指针异常;但是像这种对象访问类成员的写法最好不要使用,很容易造成误解。

 String s = null;
System.out.println(s.length());
 Demo demo = null;
demo.hah("hello");
静态绑定就是在程序执行前方法已经被绑定(在编译期中已经确定);比如 demo.hah("hello") 这个代码,反编译 class 文件得到:
 Demo demo = null;
hah((Object)"hello");

你会发现编译后方法调用已经和 demo 没有关系,必然不会抛出空指针异常。

String.valueOf(null)的更多相关文章

  1. String.valueOf(null) 报空指针

    String.valueOf 默认的方法 argument 可以为null 的 boolean b = null; char c = null; char[] data = null; double ...

  2. 从String.valueOf(null)说起

    同学在群问String.valueOf(null)返回啥,我看了下源码,返回"null"啊,   public static String valueOf(Object obj) ...

  3. 说说JDK中的String.valueOf()传null的诡异处理

    都说JDK的实现诡异多,今儿也算是被我踩到一个坑了. 就来说说关于String.valueOf的这个坑. public class TestString { public static void ma ...

  4. Java中区别.toString() ,(String),valueOf()方法

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...

  5. Integer.valueof(null)报错

    原文  http://javacat360.iteye.com/blog/2024378 主题 Java 昨天,一同事问我一个问题,估计是他前段日子面试遇到的 问题很简单,String.valueof ...

  6. (String)、toString、String.valueOf的区别

    String.valueOf()它可以将JAVA基本类型(int,double,boolean等)和对象(Object)转换成String型toString()是对象的方法,它可以将该对象转换成Str ...

  7. Java 之String.valueOf(obj)

    实例代码如下: String str = null; String uSelectDate = String.valueOf(str); System.out.println("====== ...

  8. 转换String三种方式比较:toString()、String.valueOf()、(String)

    简单介绍: 1.toString,需要保证调用这个方法的类.方法.变量不为null,否则会报空指针. 2.String.valueOf.这个方法在使用的时候是有些特殊的.一般情况下,如果是确定类型的n ...

  9. java.toString() ,(String),String.valueOf的区别

    在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 常用的方法有Object#toString(),(String)要转换的对象,S ...

随机推荐

  1. H3C 什么是路由

  2. 剑指 Offer —— 数组中重复的数字

    数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...

  3. 改善Azure App Service托管应用程序性能的几个技巧

    本文介绍了几个技巧,这些技巧可以改善Azure App Service托管应用程序的性能.其中一些技巧是你现在就可以进行的配置变更, 而其他技巧则可能需要对应用程序进行一些重新设计和重构. 开发者都希 ...

  4. ioctl 命令的实现

    ioctl 的 scull 实现只传递设备的配置参数, 并且象下面这样容易: switch(cmd) { case SCULL_IOCRESET: scull_quantum = SCULL_QUAN ...

  5. 【HTML/CSS】BFC

    块格式化上下文(Block formatting contexts) BFC是什么? 是Web页面中盒模型布局的CSS渲染模式.它的定位体系属于常规文档流. 至少满足条件之一: float 的值不为  ...

  6. linux上传文件的命令

    由于svm挂机不能通过svn提交代码,所以今天尝试了一下linux的rz和sz命令 1.sz命令是把文件下载到本地,使用方法如下 sz  文件名 回车之后会弹出一个本地的路径选择框,选择要下载的路径即 ...

  7. C语言图形界面常用函数集锦

    (以下函数均应在图形方式初始之后使用(initgraph(a,b)),在win-tc中使用BGI图形程序模板时,其中已经定义有一个initgr函数,在main函数中应在执行initgr函数之后再使用这 ...

  8. git之github推送篇

    1.创建项目  2.生成ssh密钥并设置到github 在文件夹里面右键打开git命令行,输入下面命令,然后一直回车. ssh-keygen -t rsa 生成位置在当前用户的.ssh文件夹里,带pu ...

  9. visio基础

    右下角是一个切换文件的按钮 也可以用ctrl+tab键进行切换 页面底部左边是一个页面的增加与切换的几个按钮 这是切换页面不是切换文件 右上角这个按钮是一个功能隐藏的按钮 左上角这个按钮可以自定义快速 ...

  10. VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti

    出现问题的原因: 原因一.出现此问题的原因是Device Guard或Credential Guard与Workstation不兼容. 原因二.Windows系统的Hyper-V不兼容导致. 解决方案 ...