java.lang.ExceptionInInitializerError由以下引起:java.lang.NullPointerException

时间:2013-12-09 09:12:08

标签: java exception nullpointerexception

这是来自OCJP的例子。我写了以下代码

public class Test {

  static int x[];

  static {
     x[0] = 1;
  }

  public static void main(String... args) {
  }        
}       

输出: java.lang.ExceptionInInitializerError

引起:x[0] = 1;

的java.lang.NullPointerException

为什么它会抛出NullPointerException而不是ArrayIndexOutOfBoundException

8 个答案:

答案 0 :(得分:11)

  

为什么抛出NullPointerException而不是ArrayIndexOutOfBoundException。

因为你没有初始化数组。

初始化数组

   static int x[] = new int[10];

NullPointerException的原因:

  

当应用程序在需要对象的情况下尝试使用null时抛出。   其中包括:

  • 调用null对象的实例方法。
  • 访问或修改空对象的字段。
  • 将null的长度视为数组。
  • 访问或修改null的插槽,就像它是一个数组一样。
  • 抛出null,就好像它是一个Throwable值。

你击中了更大胆的点,因为数组是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.