Gan*_*esh 10 java null nullpointerexception
我试图了解nullJava中的工作原理.
如果我们分配null给任何对象,那么场景背后会发生什么?它是否指定了指向null"对象"或其他内容的内存位置地址?
我已经尝试了以下程序,我已经明白所有人都null指向同一个位置.
但任何人都可以告诉我Java如何抛出NullPointerException以及如何null在Java中运行?
class Animal{
}
class Dog{
}
public class testItClass {
public static void main(String args[]){
Animal animal=null;
Dog dog=null;
if(((Object)dog) == ((Object)animal))
System.out.println("Equal");
}
}
Run Code Online (Sandbox Code Playgroud)
产量
等于.
如果我们将 null 分配给任何对象,它实际上是堆中的某个内存位置或其他任何东西。
应区分reference和object。您可以分配null给参考。通常使用运算符在堆中创建对象new。它返回给您一个对象的引用。
A a = new A();
Run Code Online (Sandbox Code Playgroud)
具有类型的对象A是在堆中创建的。您将得到返回参考a。如果现在你分配
a = null;
Run Code Online (Sandbox Code Playgroud)
对象本身仍然驻留在堆中,但您将无法使用引用来访问它a。
请注意,对象稍后可能会被垃圾收集。
更新:
我创建了这个类来查看它的字节码(对我来说是第一次):
public class NullTest {
public static void main (String[] args) {
Object o = new Object();
o = null;
o.notifyAll();
}
}
Run Code Online (Sandbox Code Playgroud)
它产生:
C:\Users\Nikolay\workspace\TestNull\bin>javap -c NullTest.class
Compiled from "NullTest.java"
public class NullTest {
public NullTest();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #3 // class java/lang/Object
3: dup
4: invokespecial #8 // Method java/lang/Object."<init>":()V
7: astore_1
8: aconst_null
9: astore_1
10: aload_1
11: invokevirtual #16 // Method java/lang/Object.notifyAll:()V
14: return
}
Run Code Online (Sandbox Code Playgroud)
可以看到设置null为参考结果:
8: aconst_null
9: astore_1
Run Code Online (Sandbox Code Playgroud)
基本上,它将 null 值放入堆栈顶部,然后保存到引用中。但这种机制和参考实现是 JVM 内部的。
| 归档时间: |
|
| 查看次数: |
1085 次 |
| 最近记录: |