package Sample;
public class Sample4Array {
public static void main(String[] args) {
int a[] = new int[10];
System.out.println(a[1]);
for(int i=0;i<a.length;i++) {
System.out.println(a[i]);
//default value is 0
}
Integer x[] = new Integer[10];
for(int i=0;i<x.length;i++) {
System.out.println(x[i]);
//default value is null & not throwing an exception.
}
}
}
考虑一下;第一个 for 循环返回 0 作为默认值,第二个 for 循环即使它的默认值为 null,那么它也不会抛出任何异常
您希望抛出哪个异常?空指针异常? 它不会引发此异常,因为您没有尝试访问 null 引用上的任何方法/变量。
你所看到的是完全正常的。
不会有任何NullPointerException
因为
System.out.println(x[i]);
内部利用x[i]
上的String.valueOf()
来获取其字符串表示形式。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
String.valueOf()
内部检查传入对象是否为 null,如果是,则使用 Stringnull
作为其值。见下文 :
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
它不会抛出Exception
.您没有尝试取消引用空指针。设置为Integer
对象的默认值为null
。您只是打印该null
值。但是,如果您确实尝试取消引用该null
值,则会收到错误。
如果仅执行以下操作:
Integer[] x;
变量 x指向一个null
值。如果您尝试取消引用它,您现在会收到一个错误。
当你这样做的那一刻:
x = new Integer[10];
正在使用new
运算符为其分配内存。它不再指向null
.因此,您不会得到NullPointerException
.
因为当你像这样构造一个int(原语(数组时int a[] = new int[10];
数组是用默认值0创建的
当你像这样构造一个整数(对象(数组时Integer x[] = new Integer[10];
数组是用默认值null创建的。因此,当您尝试访问任何元素时,它会为您提供其空值(空是一个值(
但是,如果您尝试对返回值执行任何操作,则会抛出空指针异常
x[i].intValue(); //this will give you java.lang.NullPointerException
- 包含对象的任何内容的默认值为 null
- 布尔值的默认值为 false。 字符
- 的默认值为空字符"\u0000"(其十进制
等效值为 0(。 - 整数/短/字节/长整型的默认值为 0
- 浮点/双精度的默认值为 0.0