首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对阵列的内存初始化背后的概念是什么?

针对阵列的内存初始化背后的概念是什么?
EN

Stack Overflow用户
提问于 2012-04-27 11:54:00
回答 5查看 134关注 0票数 0
代码语言:javascript
复制
String a[]=null;
    if(a[0]!=null)
    {
        System.err.println("dd-1");
    }

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

在第一个if条件下抛出空指针异常,但在第二个if条件下不抛出空指针异常?有没有人能给我同样的解释?这背后有没有堆内存分配的概念。

我也知道这个问题是因为缺少内存分配,字符串a[]=new String.10;请解释一下这个概念?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-27 12:01:13

在第一个if条件中,您试图访问数组中的第一个元素,即使没有为它进行分配。

在第二种情况下,你只是在测试引用。

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

代码语言:javascript
复制
String a[]=null;

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

代码语言:javascript
复制
String a[] = new String[1]

在堆上创建用于保存一个String对象的内存,a指向分配的string对象。

票数 2
EN

Stack Overflow用户

发布于 2012-04-27 11:58:50

代码语言:javascript
复制
 if(a[0]!=null)

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

代码语言:javascript
复制
 if(a!=null)

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-27 11:58:18

在Java中,数组不像C,它们是生活在堆中的对象,它们有一个特殊的类型和语法来访问它们的元素,但它们是对象,如果你想访问任何子索引,你需要这样做

代码语言:javascript
复制
String[] a = new String[10];

之后,每个元素将被初始化为null、0或false,具体取决于数组的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10344501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档