这是来自OCJP的例子。我写了以下代码
public class Test {
static int x[];
static {
x[0] = 1;
}
public static void main(String... args) {
}
}
输出: java.lang.ExceptionInInitializerError
引起:x[0] = 1;
为什么它会抛出NullPointerException
而不是ArrayIndexOutOfBoundException
。
答案 0 :(得分:11)
为什么抛出NullPointerException而不是ArrayIndexOutOfBoundException。
因为你没有初始化数组。
初始化数组
static int x[] = new int[10];
当应用程序在需要对象的情况下尝试使用null时抛出。 其中包括:
你击中了更大胆的点,因为数组是null
。
答案 1 :(得分:3)
它因x is null
而投掷NullPointerException。
x [],但没有初始化 在initialization,个对象具有空值之前,基元具有默认值(例如0,false等)
所以你应该如下所示进行初始化:
如果使用非法索引初始化并访问数组,则会出现static int x [] = new int [20];
//at the time of declaration of x
或强>
static int x [];
x = new int [20];//after declaring x[] and before using x[] in your code
ArrayIndexOutOfBoundException。
例如:
x包含20个元素,因此如果我们使用任何index < 0
或
进行访问,索引号0到19都是有效的index > 19
,将抛出ArrayIndexOutOfBoundException。
答案 2 :(得分:2)
NullPointerException
被抛出 static block
,您尝试将值1分配给数组的第一个元素( x [0] = 1 )。请注意,名为x的 int [] 数组仍未被使用。
public class Test {
static int x[];
static {
x[0] = 1;// Here is the place where NullPointException is thrown.
}
public static void main(String... args) {
}
}
有两种方法可以解决它。
1使用static int x[] = new int[5];
而不是static int x[] ;
2
更改
static {
x[0] = 1;
}
要
static {
x= new int[5];
x[0] = 1;
}
请记住: Initialize the array before you use it.
答案 3 :(得分:1)
您没有初始化x
数组。变量的声明和初始化之间存在差异。当您编写int x[];
时,您只需声明一个变量,该变量作为实例字段初始化为默认值null
。要实际创建数组,您必须编写int x[] = new int[10];
或您需要的大小。
获得NullPointerException
而不是ArrayIndexOutOfBounds
的原因是,当你有一个数组并尝试解决一个超出其界限的位置时会抛出后者,但在你的情况下你不会t有一个数组,并尝试将一些东西放入一个非exsting数组。这就是NPE
答案 4 :(得分:1)
static int x[];
static {
x[0] = 1;
}
导致NullPointerException,因为你的x数组未初始化(为空)
如果您访问的是超出范围的索引,则会发生ArrayIndexOutOfBoundException:
static int x[] = new int[10];
static {
x[20] = 1; //<-----accessing index 20
}
答案 5 :(得分:1)
很简单。这里的x是null
,您尝试将值存储在未初始化的array
中。因此NullPointerException
答案 6 :(得分:0)
<强>的NullPointerException:强> 当您尝试访问未初始化对象的属性时抛出此异常
<强> ArrayIndexOutOfBoundsException异常:强> 使用对象初始化数组但尝试访问具有无效索引的数组时,抛出此异常。
在您的情况下,由于您尚未初始化对象,因此您将获得NullPointerException。您创建了一个名为&#34; x&#34;但没有关联任何人(数组对象)。
如果您将第2行更改为,
static int x[] = new int[];
然后你会得到ArrayIndexOutOfBoundsException而不是NullPointerException。
答案 7 :(得分:0)
ExceptionInInitializerError 是未经检查的例外。
执行时,静态块,静态变量初始化,如果有任何异常,则为ExceptionInInitializerError。
示例:
class Test{
static int x = 10/0;
}
输出:
Runtime Exception: ExceptionInInitializerError caused by java.lang.ArithmeticExcpetion.
示例:
class Test{
static{
String s = null;
System.out.println(s.length());
}
}
输出:
Runtime Exception: ExceptionInInitializerError caused by java.lang.NullPointerException.