黑马程序员技术交流社区

标题: 详细了解java中的null (1) [打印本页]

作者: 1807843845    时间: 2016-1-21 16:35
标题: 详细了解java中的null (1)
相信大家对于NullPointException 这个让人又爱又恨的不陌生吧..对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰 。今天我们就来谈谈ta,了解ta ,本文有点长,请耐心看下去,对各位肯定是有帮助的
1、null的起源
null是Java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错[backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em][size=1em]Object obj = NULL; // Not Ok
[size=1em]Object obj1 = null  //Ok



2、就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你),如下代码所示:[backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

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



3、null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,来看下面的代码:[backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em][size=1em]String str = null; // null can be assigned to String
[size=1em]Integer itr = null; // you can assign null to Integer also
[size=1em]Double dbl = null;  // null can also be assigned to Double
[size=1em]  
[size=1em]String myStr = (String) null; // null can be type cast to String
[size=1em]Integer myItr = (Integer) null; // it can also be type casted to Integer
[size=1em]Double myDbl = (Double) null; // yes it's possible, no error



你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。
4、null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。如果你那样做了,编译器将会报错,如下所示:[backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em][size=1em]int i = null; // type mismatch : cannot convert from null to int
[size=1em]short s = null; //  type mismatch : cannot convert from null to short
[size=1em]byte b = null: // type mismatch : cannot convert from null to byte
[size=1em]double d = null; //type mismatch : cannot convert from null to double
[size=1em]  
[size=1em]Integer itr = null; // this is ok
[size=1em]int j = itr; // 这样转没问题,但是在运行时,会有空指针异常



正如你看到的那样,当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的
以上文章为归纳总结,也有引用的地方.


作者: 1807843845    时间: 2016-1-21 16:36
图片出错了,不好意思啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2