关于JAVA语言中的Null
小标 2018-07-19 来源 : 阅读 1072 评论 0

摘要:本文主要向大家介绍了关于JAVA语言中的Null,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了关于JAVA语言中的Null,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

什么是Java中的Null?

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

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

Object obj =  NULL ; // Not OkObject 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 intshort s = null; //  type mismatch : cannot convert from null to shortbyte b = null: // type mismatch : cannot convert from null to bytedouble 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频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程