本帖最后由 黄玉昆 于 2013-2-8 13:45 编辑
数组在内存中是如何被分配的,A[] a = new A[10],这一条语句又是怎么在内存中执行的,昨晚一直想着自己写的代码出现空指针异常的这句话,
我也在网上查了,看到别人相对较好的文章中说“空指针异常发生在对象为空,但是引用这个对象的方法上。”(地址:http://blog.csdn.net/wangkr111/article/details/7830079 )
发生在对象为空,那么说,对象是存在状态的,只不过它其中的值为空。我想着这句话,突然觉得是这样的,如图。
测试出空指针异常(Null.PointerException)代码如下- class Demo0
- {
- public static void main(String[] args)
- {
- Student[] s = new Student[10];
- for (int i=0;i<s.length;i++)
- {
- s[i].name = (String)("a " + i);
- s[i].setId(i);
- System.out.println(s[i].name + "的ID:" + s[i].getId());
- }
- }
- }
- class Student
- {
- String name;
- private int id;
- Student(String name,int id)
- {
- this.name = name;
- this.id = id;
- }
- public int getId()
- {
- return id;
- }
- public void setId(int id)
- {
- this.id = id;
- }
- }
复制代码 对于两张图片:
第一张:只是将数组这个对象的地址值赋给了栈内存中引用型变量,而此时,每个引用型变量(即a[0]..a[9])都还没有指向堆内存中的值为空的对象呢。
所以当在运行上面的代码,就会出现空指针异常,因为还没指向这个操作。但是是存在状态为空的对象的。
第二张:当给每一个元素赋值的时候,在堆内存中的对象重新赋值,不再是null了,这时数组中的元素就可以指向堆内存中已经重新赋值的对象了。
还有一点要说明的,就是内存中存储的都是数据,这些都是形象化的东西,可能我的这种理解不太准确,如果我的理解不是很正确,在此求正解。谢谢
|
|