色即是空,空即是色---java有关null的几件小事
故事背景
---摩诃般若波罗蜜多心经:
观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色;色即是空,空即是色。受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识,无眼耳鼻舌身意,无色声香味触法,无眼界,乃至无意识界,无无明,亦无无明尽,乃至无老死,亦无老死尽。无苦寂灭道,无智亦无得。以无所得故,菩提萨埵。依般若波罗蜜多故,心无挂碍,无挂碍故,无有恐怖。远离颠倒梦想,究竟涅磐,三世诸佛,依般若波罗蜜多故,得阿耨多罗三藐三菩提。故知般若波罗蜜多是大神咒,是大明咒, 是无上咒,是无等等咒,能除一切苦,真实不虚。故说般若波罗蜜多咒,即说咒曰:揭谛揭谛,波罗揭谛,波罗僧揭谛,菩提娑婆诃。
上面的经文总是让我容易冷静下来,可是java中的null总是让我有点不知所措,下面让我们看看吧!
java中的空null
我们先看几段代码吧
1.例一:null的对象性
public class NullTest {
public static void greet() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
((NullTest) null).greet();
}
}
上面的程序看起来似乎应该抛出NullPointerExceptioin 异常,因为其main 方法
是在常量null 上调用greet 方法,而你是不可以在null 上调用方法的,对吗?
其实编译和运行都没有问题。运行结果为:
Hello world!
2.例二:null的初始化
public static void main(String[] args) {
String str=null;
Integer in=null;
Double dou=null;
String str1=(String)null;
Integer in1=(Integer)null;
Double dou1=(Double)null;
int in2=null;
int in3=(int)null;
}
发现null可以初始化引用类型,也可以转换为任意的引用类型。但不能给基本类型赋值,或者转换为基本类型。
3.例三:null的相等性
public static void main(String[] args) {
System.out.println(null==null);
System.out.println(null!=null);
System.out.println(Double.NaN==Double.NaN);
System.out.println(Double.NaN!=Double.NaN);
}
结果该是什么呢?
true
false
false
true
4.例四:null不是引用类型
public static void main(String[] args) {
Integer in=null;
if(in instanceof Integer) {
System.out.println("null is integer");
}else {
System.out.println("null is not integer");
}
}
你猜会打印出什么?
结果是:
null is not integer
5.例5:不可传递
public static void main(String[] args) {
Integer i=null;
int k=i;
System.out.println(k);
}
报错:
Exception in thread "main" java.lang.NullPointerException
NullTest.main(NullTest.java:6)
6.例6:null的数组
public static void main(String[] args) {
String[] arr1={"abc","123",null,"sky"};
boolean flag=false;
for (String s1 : arr1) {
if(s1.equals("sky")) {
flag=true;
break;
}
}
System.out.println(flag);
}
运行时报错
Exception in thread "main" java.lang.NullPointerException
at NullTest.main(NullTest.java:8)
修改成:
public static void main(String[] args) {
String[] arr1={"abc","123",null,"sky"};
boolean flag=false;
for (String s1 : arr1) {
if(s1.equals("sky")) {
flag=true;
break;
}
}
System.out.println(flag);
}
就没有问题了。
追根到底
JSL3.10.7定义了null
The null type has one value, the null reference, represented by the null literal null, which is formed from ASCII characters.
JSL4.1做了补充:
1.There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
2. The null reference is the only possible value of an expression of null type.
3.The null reference can always be assigned or cast to any reference type (§5.2, §5.3, §5.5).
4.In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.
参考资料
【1】https://baike.baidu.com/item/%E8%89%B2%E5%8D%B3%E6%98%AF%E7%A9%BA/6210?fr=aladdin
【2】https://docs.oracle.com/javase/specs/jls/se12/html/jls-4.html#jls-4.1
【3】https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.10.7
【4】java解惑
色即是空,空即是色---java有关null的几件小事的更多相关文章
- java中的null类型---有关null的9件事
摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...
- Java中有关Null的9件事(转)
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- Java字符串null相加
Java字符串null相加 最近和同事讨论了下面的一段代码: String a = null; a += a; System.out.println(a); 运行结果: nullnull 本着学习的态 ...
- 虚拟架构就绪 | 谈谈Windows Server 2012 R2迁移这件小事
我们所说的“新选择”包括操作系统升级——告别Windows Server 2003或2008,选择用什么样的姿势进行升级呢? 新年伊始,正是企业对自身IT基础设施进行评估的最佳时期.在多项评估项目里面 ...
- K8s 从懵圈到熟练 – 镜像拉取这件小事
作者 | 声东 阿里云售后技术专家 导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的.而镜像拉取失败,大多数情况下都和权限有关.所以,在处理相关问题的时候,我们往往会轻松 ...
- java里null强转为某个类会报错吗?
1.定义一个User类如下: /** * @author lizhibiao * @date 2018/11/27 17:21 */public class User{ private String ...
- java中null 关键字
Java中,null是一个关键字,用来标识一个不确定的对象.null常见意义:一.null是代表不确定的对象 Java中,null是一个关键字,用来标识一个不确定的对象.因此可以将null赋给引用类 ...
- 关于Java中null的十点详解
对于每一个Java程序员来说,null肯定是一个让人头痛的东西,连Java的发明者都承认这是一项巨大的设计失误,今天就来总结一下Java中关于null的知识. 1.null不属于任何类型,可以被转换成 ...
随机推荐
- 字符编码与gcc 编译器的编码问题
最近在 vscode 中借助 gcc 编译器来配置 c 语言开发环境时,发现中文编码存在乱码问题.再加上最近学习到多字节字符与宽字符,搅在一起,搞得很乱,就把自己的理解写下来,供有需者参考吧. 1. ...
- Mysql InnoDB引擎下 事务的隔离级别
mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...
- spark与mapreduce的区别
spark是通过借鉴Hadoop mapreduce发展而来,继承了其分布式并行计算的优点,并改进了mapreduce明显的缺陷,具体表现在以下几方面: 1.spark把中间计算结果存放在内存中,减少 ...
- 第 15 篇:优化博客功能的细节,提升使用体验—— HelloDjango 系列教程
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在之前的系列教程中,我们已经实现了:文章的发布.展示.评论等功能,可能认真的小伙伴已经 ...
- Vert.x 学习之MongoDB Client
Vert.x MongoDB Client 原文档:Vert.x MongoDB Client 组件介绍 您的 Vert.x 应用可以使用 Vert.x MongoDB Client(以下简称客户端) ...
- Nginx总结(六)nginx实现负载均衡
前面讲了如何配置Nginx虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要 ...
- Android程序员接下来的路该如何走?
随着“5G”(第五代移动通信技术)商用进程越来越快,各个芯片和终端厂商们都已经开始布局准备,想必智能手机会是消费者最先能够接触到5G的重要终端,而和其相辅相生的移动互联网也势必会有新的发展. 但是和行 ...
- 如何让基于.NET 2.0的应用在高版本的系统上运行?
我们的WinForm项目是基于.NET 2.0开发的,在部署时,发现有些机器没有.NET 2.0,但是即使这些机器有装.NET 2.0 以上的版本,也无法运行我们的程序.这就比较蛋疼了. 我们查了一下 ...
- 基于redis(订阅发布)实现python和java进程间通信
主要结构为: python进程发布消息,java进程订阅消息. 依赖环境: python: pip install redis java: jedis 1. python端: PubSub.py ...
- C# HTTP网络常用方法封装
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Regi ...