0
String a[]=null;
    if(a[0]!=null)
    {
        System.err.println("dd-1");
    }

    if(a!=null)
        {
        System.err.println("dd-2");
        }
    }

在第一个 if 条件下它抛出空指针异常,但在第二个 if 条件下它不抛出空指针异常?谁能给我解释一下?这背后有什么关于堆内存分配的概念吗?

我也知道了这个问题,因为 Missing memory allocation,String a[]=new String.[10]; 请解释一下这个概念?

4

5 回答 5

2

在第一个 if 条件下,您尝试访问数组中的第一个元素,即使没有为它完成分配。

在第二种情况下,您只是在测试参考。

(把它想象成 C 指针, char *str = NULL 不分配任何东西,除了指向 NULL 的指针)

String a[]=null;

没有为数组分配内存,只创建引用。

String a[] = new String[1]

在堆上创建用于保存一个字符串对象的内存并a指向分配的字符串对象。

于 2012-04-27T04:01:12.907 回答
1
 if(a[0]!=null)

第一个条件是尝试访问数组的第一个元素(并检查它是否存在)。如果数组不存在(即为空),这将不起作用。

 if(a!=null)

第二个条件只是检查数组本身是否为空。

创建数组时,数组的内存被分配(在堆上)。那时您还必须指定它的大小(这将确切地确定分配了多少内存)。内存也用 null 初始化,所以你不会得到新数组的垃圾数据。

访问数组元素不仅仅是 C 中的指针运算,Java 实际上检查数组是否存在以及索引是否在其范围内。

于 2012-04-27T03:58:49.590 回答
0

在 Java 中,数组不像 C,它们是存在于堆中的对象,它们确实有一种特殊的类型和语法来访问它们的元素,但它们是对象,如果你想访问任何子索引,你需要做类似的事情

String[] a = new String[10];

之后,每个元素将根据数组的类型初始化为 null、0 或 false。

于 2012-04-27T03:58:17.990 回答
0

数组是对象。你必须为他们创造新的空间。如果你试图访问一个空引用,你NullPointerException每次都会得到一个。

于 2012-04-27T03:59:43.220 回答
0

如果您使用a[0],您将访问一个对象(数组的第一个对象)。但a还没有任何对象。因此第一个抛出异常。但是在第二个中,您正在检查参考。它不是一个对象。所以a等于NULL。

于 2012-04-27T04:02:20.410 回答