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的初始化默认值是否有差异?
这将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的嵌套循环,以创建隐含的数组数组.
多维数组不需要在每个级别具有相同长度的数组.
| 归档时间: |
|
| 查看次数: |
3770 次 |
| 最近记录: |