不引发对象类型的空指针异常 即使默认值为 NULL


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

最新更新