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. 从http到https--phpStudy2018

    0. 将SSL证书解压到以下目录,申请方式见 百度 Apache/cert/ 分别更名为 my_public.crt my.key my_chain.crt 1. phpStudy->其它选项菜 ...

  2. element ui 批量删除

    <el-table :data="tableData" stripe border style="width: 100%" @selection-chan ...

  3. Python中&、^与and、or

    导火索:给定两个列表,怎么找出他们相同的元素和不通的元素? list1 = [1, 2, 3, 4, 57, 8, 90] list2 = [2, 3, 4, 5, 6, 7, 8] lis = li ...

  4. [转载]sublime用法精华

    Sublime Text 全程指南 九月 03.2015. 暂无评论 永远站 作者:Lucida 原文链接:http://lucida.me/blog/sublime-text-complete-gu ...

  5. LuoguP3521 [POI2011]ROT-Tree Rotations

    P3521 [POI2011]ROT-Tree Rotations 题目大意: 给一棵\((1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 我们发现 ...

  6. HDU6581 Vacation (HDU2019多校第一场1004)

    HDU6581 Vacation (HDU2019多校第一场1004) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6581 题意: 给你n+1辆汽车, ...

  7. android studio 配置HTTP proxy

    Android SDK在线更新镜像服务器 南阳理工学院镜像服务器地址: mirror.nyist.edu.cn 端口:80 中国科学院开源协会镜像站地址: IPV4/IPV6: mirrors.ope ...

  8. Hibernate各种查询方式及查询策略(转)

    转自:https://www.cnblogs.com/xujingyang/p/6734203.html 在了解Hibernate的基本知识后,重点让我们看下相关查询方式和查询优化策略吧! 话不多说, ...

  9. Web_telnet 通过JAVA实现网页上面的命令行远程工具 以及对于流的理解

    前言 这几天研究了一下如何在web页面上通过telnet 连接一个远程的机器,通过命令行进行控制,让然,B/S架构的项目,如果直接通过 浏览器是无法和远程机器进行通信的,我们就得借助后端来帮助实现这样 ...

  10. 微信支付-小程序H5 公众号 Payment SDK

    前言 今天是2020年一天,去年最后一个月开发了订单和支付系统,尤其在支付系统和微信对接的时候遇到了很多坑,这里给大家总结下,以免大家遇到相同的问题还浪费大量时间 微信支付前期准备 微信商户号,需要商 ...