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作为默认值&amp;第二个for循环,即使它的默认值为null,那么它也不会抛出任何异常
答案 0 :(得分:4)
当您声明一个引用变量(即一个对象)时,您实际上是在创建一个指向对象的指针。请考虑以下代码,其中声明基本类型int的变量:
int x;
x = 10;
在此示例中,变量x是一个int,Java会将它初始化为0。当您在第二行中将其分配给10时,您的值10将被写入x指向的内存位置。
但是,当您尝试声明引用类型时会发生不同的事情。请使用以下代码:
Integer num;
num = new Integer(10);
第一行声明一个名为num的变量,但它不包含原始值。相反,它包含一个指针(因为类型是Integer,它是一个引用类型)。既然你还没有说什么指向Java就把它设置为null,这意味着&#34;我指的是什么&#34;。
在第二行中,new关键字用于实例化(或创建)Integer类型的对象,并为指针变量num分配此对象。您现在可以使用dereferencing operator
引用该对象。 (一点)。
当您声明变量但未创建对象时,会出现您询问的异常。如果您在创建对象之前尝试取消引用num
,则会得到{{1} }。在最琐碎的情况下,编译器将捕获问题并让您知道&#34; num可能尚未初始化&#34;但有时你会编写不直接创建对象的代码。
答案 1 :(得分:2)
您期望抛出哪种例外情况?空指针异常? 它不会抛出此异常,因为您没有尝试访问空引用上的任何方法/变量。
你所看到的是完全正常的。
答案 2 :(得分:0)
不会有任何NullPointerException
,因为
System.out.println(x[i]);
在String.valueOf()
内部使用x[i]
来获取其字符串表示。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
String.valueOf()
在内部检查传入对象是否为空,如果是,则使用字符串null
作为其值。见下文:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
答案 3 :(得分:0)
它不会抛出Exception
。您没有尝试取消引用空指针。设置为Integer
对象的默认值为null
。您只是打印null
值。但是,如果您尝试取消引用null
值,则会出错。
如果你只这样做:
Integer[] x;
变量x 指向到null
值。如果您尝试取消引用它,将立即收到错误。
你做的那一刻:
x = new Integer[10];
使用new
运算符为内存分配内存。它不再指向null
。因此,您无法获得NullPointerException
。
答案 4 :(得分:0)
因为当你构造一个像这个int a[] = new int[10];
的int(primitive)数组时,数组是用默认值0创建的
当您构造一个类似于此Integer x[] = new Integer[10];
的Integer(Object)数组时,将使用默认值null创建数组。当您尝试访问任何元素时,它将为您提供其值为null(null是一个值)
但是,如果您尝试对返回的值执行任何操作,则会抛出空指针异常
x[i].intValue(); //this will give you java.lang.NullPointerException