String.valueOf(null)
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)的更多相关文章
- String.valueOf(null) 报空指针
String.valueOf 默认的方法 argument 可以为null 的 boolean b = null; char c = null; char[] data = null; double ...
- 从String.valueOf(null)说起
同学在群问String.valueOf(null)返回啥,我看了下源码,返回"null"啊, public static String valueOf(Object obj) ...
- 说说JDK中的String.valueOf()传null的诡异处理
都说JDK的实现诡异多,今儿也算是被我踩到一个坑了. 就来说说关于String.valueOf的这个坑. public class TestString { public static void ma ...
- Java中区别.toString() ,(String),valueOf()方法
在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...
- Integer.valueof(null)报错
原文 http://javacat360.iteye.com/blog/2024378 主题 Java 昨天,一同事问我一个问题,估计是他前段日子面试遇到的 问题很简单,String.valueof ...
- (String)、toString、String.valueOf的区别
String.valueOf()它可以将JAVA基本类型(int,double,boolean等)和对象(Object)转换成String型toString()是对象的方法,它可以将该对象转换成Str ...
- Java 之String.valueOf(obj)
实例代码如下: String str = null; String uSelectDate = String.valueOf(str); System.out.println("====== ...
- 转换String三种方式比较:toString()、String.valueOf()、(String)
简单介绍: 1.toString,需要保证调用这个方法的类.方法.变量不为null,否则会报空指针. 2.String.valueOf.这个方法在使用的时候是有些特殊的.一般情况下,如果是确定类型的n ...
- java.toString() ,(String),String.valueOf的区别
在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 常用的方法有Object#toString(),(String)要转换的对象,S ...
随机推荐
- 浅谈集合框架六——集合扩展:Arrays工具类、集合与数组相互转换方式;
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- 5款顶尖Windows文件传输工具
5款顶尖Windows文件传输工具 英文原文: Drasko 日常工作中,公司里的系统管理员或其他岗位的员工都需要传递大量各种类型的文件和文档.其中一些可以通过 email 收发.但由于 email ...
- 【t056】智力问答(multiset做法)
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新年联欢会上,G.Sha负责组织智力问答节目.G.Sha建立了一个很大很大的超级题库,并衡量了每道题的 ...
- 2018-8-10-C#-6.0-字符串-String-Interpolation
title author date CreateTime categories C# 6.0 字符串 String Interpolation lindexi 2018-08-10 19:16:52 ...
- CentOS7.6部署k8s环境
CentOS7.6部署k8s环境 测试环境: 节点名称 节点IP 节点功能 K8s-master 10.10.1.10/24 Master.etcd.registry K8s-node-1 10.10 ...
- 纵我不往,知识不来--学习Java第一周心得
暑假第一周,也是开始学习java的第一周. 本周的主要时间花在了小学期的任务上,但也草草开始了java的学习.首先安装好了所需要的软件,然后在网上下载了一份<Java基础笔记>,看了前五章 ...
- FreeNOS学习1——系统安装和使用
官网安装教程:http://www.freenos.org/doxygen/index.html 整体思路:在Ubuntu操作系统下,安装qemu虚拟机,然后用虚拟机运行FreeNOS的镜像.以下是详 ...
- Python15_包的安装和管理
pip的安装及简单使用:https://www.cnblogs.com/csucat/p/4897695.html 使用pip手动安装第三方库:https://blog.csdn.net/github ...
- Python7_内置函数总结
Python Built-In 函数: str(obj) :输入(对象),返回一个对象的string格式: isinstance(object,classinfo):判断一个对象是否是一个已知的类型, ...
- Keras mlp 手写数字识别示例
#基于mnist数据集的手写数字识别 #构造了三层全连接层组成的多层感知机,最后一层为输出层 #基于Keras 2.1.1 Tensorflow 1.4.0 代码: import keras from ...