没有初始大小的字符串数组给出空指针异常

red*_*vil 5 java arrays nullpointerexception

我只是检查一些OCJP问题,并在字符串数组初始化和异常期间遇到了这种差异.

情况1

try {
    String[][] b = new String[10][10]; // 1
    System.out.println(b[0][0]);       // 2
} catch (Exception e) {
    System.out.println("Exception during array 'b' initialization");
        e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

案例2

try {
    String[][] a = new String[10][]; // 3
    System.out.println(a[0][0]);     // 4
} catch (Exception e) {
    System.out.println("Exception during array 'a' initialization");
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

第2行不会抛出任何异常,而第4行会抛出空指针异常.第2行确实输出了值null.

当指定数组的大小时,java的初始化默认值是否有差异?

Den*_*ret 5

这将a数组的类型设置为:

String[][] a
Run Code Online (Sandbox Code Playgroud)

当你写作

String[][] a = new String[10][];
Run Code Online (Sandbox Code Playgroud)

初始化外部阵列,但是你没有创建内部阵列,这样a[0]null.

当你写作

String[][] b = new String[10][10];
Run Code Online (Sandbox Code Playgroud)

运行时也会创建内部数组.它在规范中描述:

在运行时,对数组创建表达式的评估表现如下:

如果没有维度表达式,那么必须有一个数组初始值设定项.

新分配的数组将使用数组初始化程序提供的值进行初始化,如第10.6节中所述.

数组初始值设定项的值将成为数组创建表达式的值.

否则,没有数组初始值设定项,并且:

首先,从左到右评估维度表达式.如果任何表达式评估突然完成,则不评估其右侧的表达式.

接下来,检查维度表达式的值.如果任何DimExpr表达式的值小于零,则抛出NegativeArraySizeException.

接下来,为新阵列分配空间.如果没有足够的空间来分配数组,则通过抛出OutOfMemoryError突然完成对数组创建表达式的求值.

然后,如果一个单个DimExpr中出现时,一维阵列创建指定长度的,并且阵列的每个组件被初始化为默认值(§4.12.5).

否则,如果出现n个DimExpr表达式,则数组创建有效地执行一组深度为n-1的嵌套循环,以创建隐含的数组数组.

多维数组不需要在每个级别具有相同长度的数组.