对于NullPointException .对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰 。
1、null的起源
null是Java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错
2、就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false, null是任何引用类型的默认值 ,不严格的说是所有object类型的默认值。Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你),如下代码所示:
3、 null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型 ,来看下面的代码:
你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。
4、 null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。如果你那样做了,编译器将会报错 ,如下所示:
正如你看到的那样, 当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的
5、 如果使用了带有null值的引用类型变量,instanceof操作将会返回false
输出:
这是instanceof操作一个很重要的特性,使得对类型强制转换检查很有用,比较一个类是否和另一个类属于同一个类实例
6、你可以将null传递给方法使用,这时方法可以接收任何引用类型,例如public void print(Object obj)可以这样调用print(null)。从编译角度来看这是可以的,但结果完全取决于方法。Null安全的方法,如在这个例子中的print方法,不会抛出空指针异常,只是优雅的退出。如果业务逻辑允许的话,推荐使用null安全的方法。
7、 你可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。 跟SQL不一样,在Java中null==null将返回true,如下所示:
输出:null == null is true in Java
8、 任何一个对象或者一个引用变量为null的时候,这时如果调用其属性或方法,就会出现NullPointException. .
例如:
第8点在程序中是出现最多的,可能是我们自己定义了一个对象,或者从外部引用了一个对象,却没有发现这个对象是null,然后去调用其属性或者方法的时候,就会出现空指针了 ,这点切记切记
9、null的其他用途和注意事项
(1) 释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。
(2) List:允许重复元素,可以加入任意多个null。(这里添加的对象如果为空,拿出来用属性的时候就要注意非空验证了)
Set:不允许重复元素,最多可以加入一个null。
1、null的起源
null是Java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错
1
2
|
Object obj = NULL;
// Not Ok
Object obj1 =
null
//Ok
|
2、就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false, null是任何引用类型的默认值 ,不严格的说是所有object类型的默认值。Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你),如下代码所示:
1
2
3
4
5
6
|
private
static
Object myObj;
public
static
void
main(String args[]){
System.out.println(
"What is value of myObjc : "
+ myObj);
}
1
What is value of myObjc :
null
|
3、 null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型 ,来看下面的代码:
1
2
3
4
5
6
7
|
String str =
null
;
// null can be assigned to String
Integer itr =
null
;
// you can assign null to Integer also
Double dbl =
null
;
// null can also be assigned to Double
String myStr = (String)
null
;
// null can be type cast to String
Integer myItr = (Integer)
null
;
// it can also be type casted to Integer
Double myDbl = (Double)
null
;
// yes it's possible, no error
|
你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。
4、 null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。如果你那样做了,编译器将会报错 ,如下所示:
1
2
3
4
5
6
7
|
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
;
// this is ok
int
j = itr;
// 这样转没问题,但是在运行时,会有空指针异常
|
正如你看到的那样, 当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的
5、 如果使用了带有null值的引用类型变量,instanceof操作将会返回false
1
2
3
4
5
6
7
|
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"
);
}
|
输出:
1
|
iAmNull is NOT an instance of Integer
|
这是instanceof操作一个很重要的特性,使得对类型强制转换检查很有用,比较一个类是否和另一个类属于同一个类实例
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
6、你可以将null传递给方法使用,这时方法可以接收任何引用类型,例如public void print(Object obj)可以这样调用print(null)。从编译角度来看这是可以的,但结果完全取决于方法。Null安全的方法,如在这个例子中的print方法,不会抛出空指针异常,只是优雅的退出。如果业务逻辑允许的话,推荐使用null安全的方法。
7、 你可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。 跟SQL不一样,在Java中null==null将返回true,如下所示:
1
2
3
4
5
6
7
8
9
10
11
|
public
class
Test {
public
static
void
main(String args[])
throws
InterruptedException {
String abc =
null
;
if
(abc ==
null
){
System.out.println(
"null == null is true in Java"
);
}
if
(abc !=
null
){
System.out.println(
"null != null is false in Java"
);
}
}
}
|
输出:null == null is true in Java
8、 任何一个对象或者一个引用变量为null的时候,这时如果调用其属性或方法,就会出现NullPointException. .
例如:
1
2
3
4
5
6
7
8
|
public
class
Test1 {
public
static
void
main(String[] args)
throws
ParseException {
String s =
null
;
//初始化字符串为null
System.out.println(s.equals(
"null"
));
//这里调用为null的字符串的equals方法,会报NullPointException
String str =
new
String();
System.out.println(str.equals(
"null"
));
//这个调用就没问题,因为new 了一个对象,str不是null,只是对象里面是空壳而已
}
}
|
第8点在程序中是出现最多的,可能是我们自己定义了一个对象,或者从外部引用了一个对象,却没有发现这个对象是null,然后去调用其属性或者方法的时候,就会出现空指针了 ,这点切记切记
9、null的其他用途和注意事项
(1) 释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。
(2) List:允许重复元素,可以加入任意多个null。(这里添加的对象如果为空,拿出来用属性的时候就要注意非空验证了)
Set:不允许重复元素,最多可以加入一个null。
Map:Map的key最多可以加入一个null,value字段没有限制。
原文链接:http://www.importnew.com/14229.html