对于 Java 程序员来说,null 一直是令人头疼的问题,经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个巨大的设计错误。
那么关于 null ,你应该知道下面这几件事情来有效的了解 null ,从而避免很多由 null 引起的错误。
关键字
,像是 public、static、final。它是大小写敏感的,你不能将 null 写成 Null 或 NULL,编辑器将不能识别它们然后报错。这个问题已经几乎不会出现,因为eclipse 和 Idea编译器已经给出了编译器提示,所以你不用考虑这个问题。
public class DefaultNullValue {
private static Object value;
public static void printValue(){
System.out.println("value = " + value);
}
public static void main(String[] args) {
printValue();
}
}
这对静态和非静态的object来说都是正确的。就像你在这里看到的这样,我将 value 定义为静态引用,还有一个静态方法,我可以在 main 函数中直接使用它。
public static void main(String[] args) {
String str = null;
Integer itr = null;
Double dou = null;
Integer integer = (Integer) null;
String string = (String)null;
System.out.println("integer = " + integer);
System.out.println("string = " + string);
}
你可以看到在编译期和运行期内,将null 转换成任何的引用类型都是可行的,并且不会抛出空指针异常
public static void main(String[] args) {
int i = 0;
Integer itr = null;
System.out.println(itr == i);
}
instanceof
操作会返回falsepublic static void main(String[] args) {
Integer isNull = null;
// instanceof = isInstance 方法
if(isNull instanceof Integer){
System.out.println("isNull is instanceof Integer");
}else{
System.out.println("isNull is not instanceof Integer");
}
}
这是 instanceof 操作符一个很重要的特性,使得对类型强制转换检查很有用
public class ComplingBinding {
public static void staticMehtod(){
System.out.println("静态方法");
}
public void instanceMethod(){
System.out.println("非静态方法");
}
public static void main(String[] args) {
ComplingBinding binding = null;
binding.staticMehtod();
binding.instanceMethod();
}
}
public class NullSafeMethod {
private static String number;
public static void main(String[] args) {
String s = String.valueOf(number);
String string = number.toString();
System.out.println("s = " + s);
System.out.println("string = " + string);
}
}
number 没有赋值,所以默认为null,使用String.value(number)
静态方法没有抛出空指针异常,但是使用 toString()
却抛出了空指针异常。所以尽量使用对象的静态方法。
==
或者 !=
操作来比较 null 值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。跟SQL不一样,在Java中 null == null 将返回 true,如下所示:public class CompareNull {
private static String str1;
private static String str2;
public static void main(String[] args) {
System.out.println("str1 == str2 ? " + str1 == str2);
System.out.println(null == null);
}
}