,,Java中关于Null的9个解释(Java Null详解)

,,Java中关于Null的9个解释(Java Null详解)

本文主要介绍Java中关于Null的九种解释(Java Null详解)。本文详细讲解了Java中关于null的九个相关知识,有需要的朋友可以参考一下。

Null是Java程序员头疼的问题。它经常受到空指针异常(NPE)的干扰。就连Java的发明者也承认这是他的巨大错误。Java为什么保持null?Null已经存在一段时间了,我想Java的发明者都知道null带来的麻烦比它解决的问题还多,但是它还是伴随着Java。

我越来越惊讶,因为java的设计原则就是把事情简单化。这也是我不在指针、运算符重载和多继承实现上浪费时间的原因。null正好相反。嗯,这个问题我真的不知道答案。我所知道的是,无论Java开发人员和开源社区如何批评,我们都必须与null共存。与其后悔null的存在,不如更好地学习它,确保正确使用它。

Java中为什么需要学习null?如果不重视null,Java会让你遭受null指针异常,你也会得到惨痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户会更欣赏你。根据我的经验,空指针异常的一个主要原因是缺乏Java中关于空的知识。你们很多人已经对null很熟悉了,但是对于不熟悉的人,可以学习一些关于null的新旧知识。让我们重新学习一些关于Java中null的重要知识。

Java中的Null是什么?

我说过,null在Java中是一个非常重要的概念。Null最初是用来表示缺少的东西,比如缺少用户、资源或其他东西。然而一年后,麻烦的空指针异常给Java程序员造成了不小的困扰。在这份材料中,我们将学习Java中null关键字的基本细节,并探索一些最小化null检查的技术以及如何避免令人厌恶的null指针异常。

1)首先,null是Java中的一个关键字,和public、static、final一样。它是区分大小写的,不能把NULL写成null或者Null,编译器不会识别它们并报错。

复制代码如下:

Object obj=NULL//不正常

对象obj1=空//正常

使用其他语言的程序员可能会有这个问题,但是现在IDE的使用已经让这个问题可以忽略不计了。现在,当您键入代码时,像Eclipse和Netbeans这样的ide可以纠正这个错误。但是用其他工具比如记事本,Vim,Emacs,这个问题会浪费你宝贵的时间。

2)就像每个原语类型都有默认值一样,比如int的默认值是0,boolean的默认值是false,null是任何引用类型的默认值,严格来说不是所有对象类型的默认值。就像你创建一个布尔类型的变量,以false为默认值,Java中任何引用变量都以null为默认值。这适用于所有变量,比如成员变量、局部变量、实例变量和静态变量(但是当你使用一个没有初始化的局部变量时,编译器会警告你)。为了证明这一事实,您可以通过创建一个变量并打印其值来观察这个引用变量,如下面的代码所示:

复制代码如下:

私有静态对象myObj

公共静态void main(String args[]){

system . out . println(' myObjc的值是什么:' myObj ');

}

myObjc : null的值是什么

对于静态和非静态对象都是如此。正如您在这里看到的,我将myObj定义为一个静态引用,所以我可以在main方法中直接使用它。注意main方法是静态方法,不能使用非静态变量。

3)我们想澄清一些误解。null既不是对象也不是类型,它只是一个特殊的值。可以将其赋予任何引用类型,也可以将null转换为任何类型。让我们看看下面的代码:

复制代码如下:

String str=null//null可以赋给字符串

整数itr=null//也可以将null赋给Integer

Double dbl=null//null也可以赋给Double

String myStr=(String)null;//null可以转换为字符串类型

Integer myItr=(Integer)null;//它也可以被类型转换为整数

Double my dbl=(Double)null;//是的,这是可能的,没有错误

可以看到,在编译时和运行时将null强制转换为任何引用类型都是可行的,并且在运行时不会抛出null指针异常。

4)null可以赋给引用变量,但是不能赋null给基本类型变量,比如int,double,float,boolean。如果这样做,编译器将报告如下错误:

复制代码如下:

int i=null//类型不匹配:无法从null转换为int

短s=null//类型不匹配:无法从null转换为short

byte b=null: //类型不匹配:无法从null转换为byte

double d=null//类型不匹配:无法从null转换为double

整数itr=null//这个可以

int j=itr//这也可以,但是运行时会出现NullPointerException

如你所见,当你直接将null赋给基本类型时,会出现编译错误。但是,如果您将null赋给包装类对象,然后将object赋给它们各自的基本类型,编译器不会报告它,但是您会在运行时遇到null指针异常。这是Java中自动拆箱造成的,我们会在下一点看到。

5) 当Java解包生成基本数据类型时,任何带有空值的包装类都会抛出空指针异常。一些程序员错误地认为自动装箱会将null转换为其基本类型的默认值,例如,将int转换为0,将Boolean转换为false,但这是不正确的,如下所示:

复制代码如下:

Integer iAmNull=null

int i=iAmNull//记住——没有编译错误

但是当您运行上面的代码片段时,您会看到主线程在控制台上抛出一个空指针异常。当使用HashMap和整数键值时,会出现许多这样的错误。当您运行下面的代码时,将会出现一个错误。

复制代码如下:

导入Java . util . hashmap;

导入Java . util . map;

/**

*自动装箱和NullPointerExcpetion的示例

*

* @作者WINDOWS 8

*/

公共类测试{

公共静态void main(String args[])引发InterruptedException {

map number and count=new HashMap();

int[] numbers={3,5,7,9,11,13,17,19,2,3,5,33,12,5 };

for(int i : numbers){

int count=numberandcount . get(I);

numberAndCount.put(i,count);//此处出现NullPointerException

}

}

}

输出:

复制代码如下:

线程“main”Java . lang . nullpointerexception中出现异常

位于Test.main(Test.java:25)

这段代码看起来非常简单,没有错误。您所要做的就是找出一个数字在数组中出现了多少次,这是在Java数组中查找重复项的典型技术。首先,开发人员获取之前的值,然后加1,最后将值放回地图中。程序员可能认为在调用put方法时,自动装箱会自行将int装箱为整数,但他忘了,当一个数没有计数值时,HashMap的get()方法会返回null而不是0,因为Integer的默认值是null而不是0。当空值被传递给int变量时,自动装箱将返回空指针异常。想象一下,如果这段代码在一个if嵌套中,并且不在QA环境中运行,但是一旦你把它放到生产环境中,嘣:-)

6)如果使用具有空值的引用类型变量,instanceof操作将返回false:

复制代码如下:

Integer iAmNull=null

if(iAmNull instanceof Integer){

System.out.println('iAmNull是Integer的实例');

}否则{

System.out.println('iAmNull不是Integer的实例');

}

输出:

复制代码如下:

AmNull不是整数的实例

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

7)您可能知道不能调用非静态方法来使用带有空值的引用类型变量。它会抛出一个空指针异常,但是你可能不知道你可以用一个静态方法来使用一个空值的引用类型变量。因为静态方法使用静态绑定,所以不会引发空指针异常。下面是一个例子:

复制代码如下:

公共类测试{

公共静态void main(String args[]){

测试myObject=null

my object . iamstaticmethod();

my object . iamonstaticmethod();

}

私有静态void iAmStaticMethod(){

System.out.println('我是静态方法,可以通过空引用调用');

}

private void iamonstaticmethod(){

System.out.println('我是非静态方法,不要date用null来调用我');

}

输出:

复制代码如下:

我是静态方法,可以通过空引用调用

线程“main”Java . lang . nullpointerexception中出现异常

at Testing.main(Testing.java:11)

8)您可以将null传递给要使用的方法。此时,该方法可以接收任何引用类型。比如public void print(Object obj)可以这样调用print(null)。从编译的角度来看,这是可能的,但是结果完全取决于方法。一个安全的null方法,比如本例中的print方法,不会抛出Null指针异常,而是优雅地退出。如果业务逻辑允许,建议使用null safe方法。

9)可以用==或者!=比较空值的运算,但不能使用其他算法或逻辑运算,如小于或大于。与SQL不同,null==null在Java中将返回true,如下所示:

复制代码如下:

公共类测试{

公共静态void main(String args[])引发InterruptedException {

字符串abc=null

String cde=null

if(abc==cde){

System.out.println('null==null在Java中为真');

}

if(null!=null){

System.out.println('null!=null在Java中为false’);

}

//传统的空检查

if(abc==null){

//做点什么

}

//不正常,编译时错误

if(abc null){

}

}

}

输出:

复制代码如下:

null==null在Java中为真

Java里都是关于null的。通过Java编程的一些经验和使用简单的技术来避免空指针异常,您可以使您的代码空安全。因为null通常用作空值或未初始化的值,所以它是混淆的根源。对于方法来说,当null作为参数时,记录方法的行为也是非常重要的。总之,记住,null是任何引用类型变量的默认值,在java中不能用null引用调用任何实例方法或实例变量。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: