package com.javabase.javabase.nullInJava;
import org.junit.Test;
import org.springframework.expression.spel.ast.NullLiteral;
/**
* @Author ShawnYang
* @Date 2019-10-18 18:06
* @Description TODO
* 修改人:
* 修改时间:
* 修改备注:
*/
public class NullInJavaTest {
// ①null值大小写敏感
// private String str= Null;
private String str=null;
// ② null 是任何引用类型的隐式初始默认值
private String str2;
private Integer integer;
// ③ null 可以被赋值给任何引用类型,同时也可以将null转化成任何引用类型
private String str3=(String)null;
private Integer i=(Integer)null;
// ④ null 不能赋值给基本类型变量
// ⑤ 引用类型变量为null,通过自动拆箱把引用类型变量变为基本类型变量,会报空指针异常
// 特别是在map结构中 k v 都是包装对象,当遍历时,赋值给基本对象,如果k 或 v 是null 会抛出空指针异常
// int a=i;//此时会编译不通过
// ⑥ null不是任何一个类型的子类
@Test
public void test(){
// System.out.println(str);
System.out.println(integer);
// System.out.println(a);
System.out.println(i instanceof Integer);//⑥ false
}
}
// ⑦ 可以将null 传递给方法的引用类型入参
// ⑧ 可以使用== 和!= 来比较null值,不能使用其他算法或者大于小于等逻辑操作
// 最好使用null值在前(null == something/null != something),容易发现异常,少用something == null/something != null
// 也可使用equals 进行比较 同样null 最好放在前面
// ⑨ 使用一个值为 null 的引用类型变量调用非静态方法,会抛出空指针异常,但是可以 使用一个值为 null 的引用类型变量调用静态方法,因为静态方法
//使用静态绑定(在对象创建之前就已经绑定了),不会抛出空指针异常。
public class ceshi{
public static void main(String args[]){
ceshi myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}
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 ceshi.main(ceshi.java:6)
我们可以看到对象完全没有实例化但是却正常的执行了其静态的方法,这其实也不奇怪,静态方法完全可以使用类名直接使用,只不过绕了个弯,编译器,所以不足为奇。
与null 最常见的异常:java.lang.NullPointerException
引发这个异常的情况有:
调用 null 对象的实例方法
访问或修改 null 对象的属性
将 null 作为一个数组,获得其长度
将 null 作为一个数组,访问或修改其时间片
将 null 作为 Throwable 值抛出