什么是Java中的Null?

null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户、资源或任何东西而发明出来的。但是这也为Java程序员带来了很多麻烦,比如最常见的空指针异常(NullPointerException),下面我们将学习Java中null关键字的基本知识,并探讨一些技术以减少null检查,以及如何避免恶意的空指针异常。

1)首先,null是Java关键字,和public、static、final一样。它是区分大小写的,你不能将null写为NullNULL,编译器不会识别它们并会给出一个错误。

Object obj =  NULL ; // Not Ok
Object obj1 = null // Ok

其他编程语言也有这个问题,但是现在大多数人都在使用IDE,这样的问题很容易避免,但是对于一些使用记事本、Vim或Emacs等程序来编写代码的程序员来说,这样的问题很常见,找出此类错误往往会浪费大量的时间。

2)就像每个基本类型一样,他们都有其默认值,例如 int 一般为0,boolean 有 false,null 是任何引用类型的默认值。就比如你创建了一个布尔变量,它的默认值是 false,Java 中的任何引用变量的默认值都为 null。这适用于所有类型的变量,例如成员变量或局部变量、实例变量或静态变量,但是如果你声明了一个局部变量但不初始化它,编译器会给出一个警告。为了验证这个事实,你可以创建一个变量来查看引用变量的值,并将其打印,如下面代码所示:

private static Object myObj;
public static void main(String args[]){
System.out.println("What is value of myObjc : " + myObj);
}

输出结果为:

What is value of myObjc : null

对于静态和非静态来说结果都是一样的。

3)与创建的误解不同,null 既不是对象,也不是类型。它只是一个特殊的值,可以分配给任何引用类型,并且可以使用强制类型转换将任何类型转换为 null。如下所示:

String str = null; // null可以赋值给String
Integer itr = null; // 你也可以将null赋值给Integer
Double dbl = null; // null也可以赋值给Double String myStr = (String) null; // 可以将null类型转换为String
Integer myItr = (Integer) null; // 它也可以被转换为Integer
Double myDbl = (Double) null; // 这也是可以的

在编译和运行时,你可以看到可以将null转换到任何引用类型,不想许多人想象的那样,这里并不会出现NullPointerException

4)null 只能赋给引用类型,不能将 null 赋给基本类型,例如 int、double、float 或 boolean。如果你这样做,编译器会给出一个错误,如下所示:

int i = null; // type mismatch : cannot convert from null to int
short s = null; // type mismatch : cannot convert from null to short
byte b = null: // type mismatch : cannot convert from null to byte
double d = null; //type mismatch : cannot convert from null to double Integer itr = null; // 这是可以的
int j = itr; // 这也是可以的,但是在运行时会出现NullPointerException

正如你所看到的,如果你直接将 null 赋值给基本类型,编译器会给出类型不匹配的错误,但是你将 null 赋值给一个包装器对象,然后将该对象赋值给基本类型,这样可以通过编译器,但是在运行时会产生空指针异常的错误。这些都发生在Java的自动装箱中,我们在下面可以看到。

5)当Java将包装器还原到基本类型时,任何具有值 null 的包装器类都会抛出java.lang.NullPointerException。有些程序员错误的认为,自动装箱会负责将 null 转换为各自的基本类型的默认值,例如0为int,flase为boolean,但事实并不是这样。如下所示:

Integer iAmNull = null;
int i = iAmNull; // 记住:这里没有编译错误

但是当你运行上面的代码时,你将会看到线程"main"出现"java.lang.NullPointerException"异常。这在使用 HashMao 和 Integer key 值时经常发生。

7)如果对任何引用变量使用 null 或 null 文本本身,instanceof运算符都将返回 false。例如:

Integer iAmNull = null;
if(iAmNull instanceof Integer){
System.out.println("iAmNull is instance of Integer");
}else{
System.out.println("iAmNull is NOT an instance of Integer");
}

输出:

iAmNull is NOT an instance of Integer

这是instanceof操作符的一个重要特性,它对类型转换检查非常有用。

7)你可能知道不能使用 null 值的引用变量调用非静态方法,它将抛出NullPointerException,但是你可能不知道,你可以使用 null 值的引用变量调用静态方法,由于静态方法使用静态绑定进行绑定,所以不会抛出"NullPointerException"。下面是一个例子:

public class Testing {
public static void main(String args[]){
Testing myObject = null;
myObject.iAmStaticMethod();// 正常输出
myObject.iAmNonStaticMethod();//抛出NullPointerException
} private static void iAmStaticMethod(){
System.out.println("I am static method, can be called by null reference");
} private void iAmNonStaticMethod(){
System.out.println("I am NON static method, don't date to call me by null");
} }

输出:

I am static method, can be called by null reference
Exception in thread "main" java.lang.NullPointerException
at Testing.main(Testing.java:11)

8)你可以将 null 传递给方法,该方法接受任何引用类型,例如public void print(Object obj)可以被称为print(null),从编译器角度来看,这是可以的,但是行为完全依赖于该方法。在这种情况下,null 是安全的,不会抛出NullPointerException,它们只是正确的退出。如果业务逻辑允许,建议编写null安全方法。

9)可以使用"=="运算符和"!="运算符比较空值,但不能与其他算术或逻辑运算符(例如大于或小于)一起使用。与SQL不同,Java中的"null == null"将返回true。如下所示:

public class Test {

    public static void main(String args[]) throws InterruptedException {

       String abc = null;
String cde = null; if(abc == cde){
System.out.println("null == null is true in Java");
} if(null != null){
System.out.println("null != null is false in Java");
} // classical null check
if(abc == null){
// ...
} // not ok, compile time error
if(abc > null){ }
}
}

输出:

null == null is true in Java

总结:以上这些就是关于Java中null。通过Java编码的一些经验,使用简单的技巧来避免出现 NullPointerExcpetion,可以使得代码更加安全。由于 null 可以被视为空或者未初始化的值,因此它通常是混淆的来源。请记住,null 是任何引用变量的默认值,你不能用它调用任何实例方法,也不能在Java中使用 null 引用访问实例变量。

关于 Java 中的 Null的更多相关文章

  1. Java中有关Null的9件事

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

  2. 转!!Java中关于Null的9个解释(Java Null详解)

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

  3. JAVA中String = null 与 String = "" 的区别

    JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...

  4. 关于Java中的Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

  5. Java中的Null是什么?

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

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

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

  7. java中,null值可以被强制转换为任何类型

    java中,null值可以被强制转换为任何类型

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

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

  9. Java中的null值总结

    自我总结,有什么不对或不到位的地方,请指出,感激不尽! 目的:熟练掌握java中null值出现的情况,避免NullPointerException 代码环境准备:需要引入junit;将代码packag ...

随机推荐

  1. 小程序echarts数据不改变,或者是一次渲染成功,第二次进入,渲染失败的解决办法

    1.引入echarts插件: import * as echarts from '../../ec-canvas/echarts'; 2.data中定义: ecBar: { onInit: initC ...

  2. pygame 入门实例

    本文基于win7(64) + py3.5(64)环境. 本文是这里的一篇学习笔记.加入了自己的理解. 本文最终目的是实现一个飞机躲避导弹的游戏. 1.核心概念 pygame 的核心概念有: Surfa ...

  3. JS设置状态栏

    JS设置状态栏可通过window.status = str来设置,在后台可通过 ClientScript.RegisterStartupScript( this.GetType(), "12 ...

  4. shell变量常用方法

    变量之数组操作: 参考网址:http://www.jb51.net/article/55253.htm #直接赋值 [root@local-]=chengd [root@local-]=xrd [ro ...

  5. SpringCloud+Boot简单例子笔记

    一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...

  6. 详解C#7.0新特性

    1. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” .如下所示: 1 var input ...

  7. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

  8. Unity3d Transform.forward和Vector3.forward的区别!

    在Unity中有两个forward,一个是Transform.forward一个是Vector3.forward. 对于Vector3来说,它只是缩写.没有其它任何含义. Vector3.forwar ...

  9. 3. Python3 基本数据类型

    Python3 基本数据类型 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型& ...

  10. Alpha阶段结束分数(百分制)