暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

空指针异常(NullPointerException)和垃圾回收器GC

哈特费尔德的思考 2021-08-24
1120

1.出现空指针异常的前提条件

"空引用"访问实例【对象相关】相关的数据时,都会出现空指针异常。
出现空指针异常时往往编译可以通过,但是运行阶段出问题


2.垃圾回收器:GC

在java语言中,垃圾回收器主要针对的是堆内存。
当一个java对象没有任何引用指向该对象的时候,GC会考虑将该垃圾数据释放回收掉。
// 把这个内存图画出来。一定要按照程序的执行顺序一步一步画。
public class T{
A o1; // 成员变量中的实例变量。必须先创建对象,通过“引用”来访问。


public static void main(String[] args){
D d = new D();
C c = new C();
B b = new B();
A a = new A();
T t = new T();


//这里不写代码会出现NullPointerException异常。(空指针异常。)
c.o4 = d;
b.o3 = c;
a.o2 = b;
t.o1 = a;


// 编写代码通过t来访问d中的i
//System.out.println(T.a); //错误的。
System.out.println(t.o1.o2.o3.o4.i);
}
}
class A{
B o2;
}
class B{
C o3;
}
class C{
D o4;
}
class D{
int i;
}
/*
空指针异常。(NullPointerException)


关于垃圾回收器:GC
在java语言中,垃圾回收器主要针对的是堆内存。
当一个java对象没有任何引用指向该对象的时候,
GC会考虑将该垃圾数据释放回收掉。

出现空指针异常的前提条件是?
"空引用"访问实例【对象相关】相关的数据时,都会出现空指针异常。
*/
public class NullPointerTest{
public static void main(String[] args){
// 创建客户对象
Customer c = new Customer();
// 访问这个客户的id
System.out.println(c.id); // 0


// 重新给id赋值
c.id = 9521; // 终身代号
System.out.println("客户的id是=" + c.id);


c = null;
// NullPointerException
// 编译器没问题,因为编译器只检查语法,编译器发现c是Customer类型,
// Customer类型中有id属性,所以可以:c.id。语法过了。
// 但是运行的时候需要对象的存在,但是对象没了,尴尬了,就只能出现一个异常。
System.out.println(c.id);
}
}


class Customer{
// 客户id
int id; // 成员变量中的实例变量,应该先创建对象,然后通过“引用.”的方式访问。
}


文章转载自哈特费尔德的思考,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论