故事背景

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

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

上面的经文总是让我容易冷静下来,可是java中的null总是让我有点不知所措,下面让我们看看吧!

java中的空null

我们先看几段代码吧

1.例一:null的对象性

  1. public class NullTest {
  2. public static void greet() {
  3. System.out.println("Hello world!");
  4. }
  5. public static void main(String[] args) {
  6. ((NullTest) null).greet();
  7. }
  8. }

上面的程序看起来似乎应该抛出NullPointerExceptioin 异常,因为其main 方法

是在常量null 上调用greet 方法,而你是不可以在null 上调用方法的,对吗?

其实编译和运行都没有问题。运行结果为:

Hello world!

2.例二:null的初始化

  1. public static void main(String[] args) {
  2. String str=null;
  3. Integer in=null;
  4. Double dou=null;
  5.  
  6. String str1=(String)null;
  7. Integer in1=(Integer)null;
  8. Double dou1=(Double)null;
  9.  
  10. int in2=null;
  11. int in3=(int)null;
  12. }

发现null可以初始化引用类型,也可以转换为任意的引用类型。但不能给基本类型赋值,或者转换为基本类型。

3.例三:null的相等性

  1. public static void main(String[] args) {
  2. System.out.println(null==null);
  3. System.out.println(null!=null);
  4. System.out.println(Double.NaN==Double.NaN);
  5. System.out.println(Double.NaN!=Double.NaN);
  6. }

结果该是什么呢?

true

false

false

true

4.例四:null不是引用类型

  1. public static void main(String[] args) {
  2. Integer in=null;
  3. if(in instanceof Integer) {
  4. System.out.println("null is integer");
  5. }else {
  6. System.out.println("null is not integer");
  7. }
  8. }

你猜会打印出什么?

结果是:

null is not integer

5.例5:不可传递

  1. public static void main(String[] args) {
  2. Integer i=null;
  3. int k=i;
  4. System.out.println(k);
  5. }

报错:

Exception in thread "main" java.lang.NullPointerException

NullTest.main(NullTest.java:6)

6.例6:null的数组

  1. public static void main(String[] args) {
  2. String[] arr1={"abc","123",null,"sky"};
  3. boolean flag=false;
  4. for (String s1 : arr1) {
  5. if(s1.equals("sky")) {
  6. flag=true;
  7. break;
  8. }
  9. }
  10. System.out.println(flag);
  11. }

运行时报错

Exception in thread "main" java.lang.NullPointerException

at NullTest.main(NullTest.java:8)

修改成:

  1. public static void main(String[] args) {
  2. String[] arr1={"abc","123",null,"sky"};
  3. boolean flag=false;
  4. for (String s1 : arr1) {
  5. if(s1.equals("sky")) {
  6. flag=true;
  7. break;
  8. }
  9. }
  10. System.out.println(flag);
  11. }

就没有问题了。

追根到底

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. Atcode B - Colorful Hats(思维)

    题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_b 题解:挺有意思的题目主要还是模拟出最多有几种不可能的情况,要知道ai的差距不能超过1这个想想就 ...

  2. CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法

    Knights of a Polygonal Table time limit per test 1 second memory limit per test 256 megabytes input ...

  3. react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题

    在react页面内嵌“微信二维码”,实现PC端通过微信扫码进行登录.首先去微信开放平台注册一个账号,创建一个网站应用,提交网站备案审核,获取appid和appsecret:其他开发流程根据微信文档来进 ...

  4. Go操作NSQ

    NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ. NSQ NSQ介绍 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异. NSQ的优势有 ...

  5. ASP.NET Core 2.2 : 二十一. 内容协商与自定义IActionResult和格式化类

    上一章的结尾留下了一个问题:同样是ObjectResult,在执行的时候又是如何被转换成string和JSON两种格式的呢? 本章来解答这个问题,这里涉及到一个名词:“内容协商”.除了这个,本章将通过 ...

  6. SSM相关面试题(简答)

    1.springmvc的执行    流程: 2.mybstis的执行流程: 3.ioc和DI的理解: 4.对aop的理解: 5.spring中常见的设计模式: 6.spring中声明式事务处理的配置: ...

  7. Admiral(双向BFS + Hash)

    Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces have g ...

  8. CentOS7 自定义登录前后欢迎信息

    博客地址:http://www.moonxy.com 一.摘要 本人当前使用的是阿里云 ECS 服务器,操作系统为 linux,发行版为 CentOS 7.4.1708.系统默认都已经提供了欢迎信息, ...

  9. elasticsearch Discovery 发现模块学习

    发现模块和集群的形成 目标 发现节点 Master选举 组成集群,在Master信息发生变化时及时更新. 故障检测 细分为几个子模块 Discovery发现模块 Discover是在集群Master节 ...

  10. loadrunner12下载、安装、认证、汉化

    友情提示 推荐工具pandownload下载 本文尽可能地写得详细一些,有不懂的请先自行百度 安装过程中会有大量英文,可以用有道词典截图翻译 若你的电脑只有一个分区,则建议所有位置选择默认,或者根据个 ...