故事背景

---摩诃般若波罗蜜多心经:

观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色;色即是空,空即是色。受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识,无眼耳鼻舌身意,无色声香味触法,无眼界,乃至无意识界,无无明,亦无无明尽,乃至无老死,亦无老死尽。无苦寂灭道,无智亦无得。以无所得故,菩提萨埵。依般若波罗蜜多故,心无挂碍,无挂碍故,无有恐怖。远离颠倒梦想,究竟涅磐,三世诸佛,依般若波罗蜜多故,得阿耨多罗三藐三菩提。故知般若波罗蜜多是大神咒,是大明咒, 是无上咒,是无等等咒,能除一切苦,真实不虚。故说般若波罗蜜多咒,即说咒曰:揭谛揭谛,波罗揭谛,波罗僧揭谛,菩提娑婆诃。

上面的经文总是让我容易冷静下来,可是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的几件小事的更多相关文章

  1. java中的null类型---有关null的9件事

    摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...

  2. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...

  3. Java中有关Null的9件事(转)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  4. Java字符串null相加

    Java字符串null相加 最近和同事讨论了下面的一段代码: String a = null; a += a; System.out.println(a); 运行结果: nullnull 本着学习的态 ...

  5. 虚拟架构就绪 | 谈谈Windows Server 2012 R2迁移这件小事

    我们所说的“新选择”包括操作系统升级——告别Windows Server 2003或2008,选择用什么样的姿势进行升级呢? 新年伊始,正是企业对自身IT基础设施进行评估的最佳时期.在多项评估项目里面 ...

  6. K8s 从懵圈到熟练 – 镜像拉取这件小事

    作者 | 声东 阿里云售后技术专家 导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的.而镜像拉取失败,大多数情况下都和权限有关.所以,在处理相关问题的时候,我们往往会轻松 ...

  7. java里null强转为某个类会报错吗?

    1.定义一个User类如下: /** * @author lizhibiao * @date 2018/11/27 17:21 */public class User{ private String ...

  8. java中null 关键字

    Java中,null是一个关键字,用来标识一个不确定的对象.null常见意义:一.null是代表不确定的对象  Java中,null是一个关键字,用来标识一个不确定的对象.因此可以将null赋给引用类 ...

  9. 关于Java中null的十点详解

    对于每一个Java程序员来说,null肯定是一个让人头痛的东西,连Java的发明者都承认这是一项巨大的设计失误,今天就来总结一下Java中关于null的知识. 1.null不属于任何类型,可以被转换成 ...

随机推荐

  1. hdu6354 杭电第五场 Everything Has Changed 计算几何

    Everything Has Changed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java ...

  2. lightoj 1245 Harmonic Number (II)(简单数论)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1245 题意:求f(n)=n/1+n/2.....n/n,其中n/i保留整数 显 ...

  3. win10 无法安装/启用 .net framework 3.5

    有些程序依赖.net framework 3.5 win10可以在控制面板->程序和功能->启用或关闭windows功能 启用 但有时会报错 比如 0x800f0950 官方论坛的解决办法 ...

  4. SVN更新失败

    一.svn更新失败 使用svn遇到的问题是,更新失败,代码被锁定. 解决办法: 在项目上右键,如图所示: 图一: ​ 图二: ​ 之后再更新,基本上都没有问题了.如果还有问题,看下面. 二.工具清理 ...

  5. 还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)

    作者 | 阿里云售后技术专家 声东 导读:当我们尝试去理解 K8s 集群工作原理的时候,控制器(Controller)肯定是一个难点.这是因为控制器有很多,具体实现大相径庭:且控制器的实现用到了一些较 ...

  6. springcloud(四):应用配置中心config的安全设置

    springcloud应用配置中心config的安全设置 在springcloud应用开发中,为了方便在线管理我们的配置文件,通常会配一个配置中心config-server,这里托管着应用的一些配置文 ...

  7. 粗糙版ORM(附详细注释)

    目录 ORM 其他 ORM代码 数据库表代码 mysql代码 db/models.py db/pymysql_opreator.py ORM 作为数据库表记录 和 python中对象的映射关系中间件 ...

  8. 线上问题排查神器 Arthas

    线上问题排查神器 Arthas 之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器.都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单.如果 ...

  9. Burpsuit构造测试数据

      一.使用场景 测试设备web性能优化时,需要构造或删除多个user.设备.设备账号.订单等,除了使用excel批量导入外,有些数据构造/删除使用burpsuit代理并将对应请求发送到Burp In ...

  10. Java设计模式 - 单例模式(创建型模式)

    单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...