String a[]=null;
if(a[0]!=null)
{
System.err.println("dd-1");
}
if(a!=null)
{
System.err.println("dd-2");
}
}
首先如果condtion它抛出空指针异常,但在第二条件条件下它不会抛出空指针异常?任何人都可以解释我一样吗?在堆内存分配上有没有任何概念。
我也知道因缺少内存分配而导致的问题,字符串a [] =新字符串。[10];请透露这个概念吗?
答案 0 :(得分:2)
在第一个if条件中,您尝试访问数组中的第一个元素,甚至认为没有为它完成分配。
在第二种情况下,您只是测试参考。
(把它想象成C指针,char * str = NULL除了指针指向NULL之外没有分配任何东西)
String a[]=null;
没有为数组分配内存,只创建了引用。
String a[] = new String[1]
在堆上创建一个容纳一个String对象的内存,并且a
指向分配的字符串对象。
答案 1 :(得分:1)
if(a[0]!=null)
第一个条件是尝试访问数组的第一个元素(并检查它是否存在)。如果数组不存在(即为空),那将无效。
if(a!=null)
第二个条件是检查数组本身是否为空。
创建数组时,会在阵列上分配(在堆上)数组的内存。那时你还必须指定它的大小(这将确定分配多少内存)。内存也使用null初始化,因此您不会获得新数组的垃圾数据。
对数组元素的访问不仅仅是在C中的指针算术,Java实际上会检查数组是否存在以及索引是否在其范围内。
答案 2 :(得分:0)
在Java中,数组不像C,它们是生活在堆中的对象,它们有一种特殊的类型和语法来访问它们的元素但是它们是对象,如果你想访问你需要做的任何子索引
之类的东西String[] a = new String[10];
之后,每个元素将初始化为null,0或false,具体取决于数组的类型。
答案 3 :(得分:0)
数组是对象。你必须为他们创造新的空间。如果您尝试访问空引用,则每次都会获得NullPointerException
。
答案 4 :(得分:0)
如果使用a[0]
,则将访问对象(数组的第一个对象)。但是a
还没有任何对象。因此,第一个抛出异常。但在第二个中,您正在检查参考。它不是一个对象。所以a
等于NULL。