Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.ExceptionInInitializerError由以下原因引起:java.lang.NullPointerException_Java_Exception_Nullpointerexception - Fatal编程技术网

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

java.lang.ExceptionInInitializerError由以下原因引起:java.lang.NullPointerException,java,exception,nullpointerexception,Java,Exception,Nullpointerexception,这是来自OCJP示例。我已经编写了以下代码 public class Test { static int x[]; static { x[0] = 1; } public static void main(String... args) { } } 输出:java.lang.ExceptionInInitializeError 原因:java.lang.NullPointerException atx[0]=1 为什么它抛出Nu

这是来自OCJP示例。我已经编写了以下代码

public class Test {

  static int x[];

  static {
     x[0] = 1;
  }

  public static void main(String... args) {
  }        
}       
输出:java.lang.ExceptionInInitializeError

原因:java.lang.NullPointerException at
x[0]=1

为什么它抛出
NullPointerException
而不是
ArrayIndexOutOfBoundException

为什么它抛出NullPointerException而不是ArrayIndexOutOfBoundException

因为您没有初始化数组

初始化数组

   static int x[] = new int[10];
原因:

当应用程序在需要对象的情况下尝试使用null时引发。 这些措施包括:

  • 调用空对象的实例方法
  • 访问或修改空对象的字段
  • 将null的长度视为数组
  • 像数组一样访问或修改null的插槽。
  • 将null作为可丢弃的值抛出

由于数组为
null

,因此您没有初始化
x
数组,因此被粗体点击中。变量的声明和初始化之间存在差异。当你写
intx[]时
您只需声明一个变量,该变量作为实例字段,使用默认值
null
初始化。要实际创建数组,必须编写
intx[]=newint[10]或您需要的大小


获取
NullPointerException
而不是
ArrayIndexOutOfBounds
的原因是,当您确实有一个数组并尝试寻址其边界以外的位置时,会抛出后者,但在您的情况下,您根本没有数组,并尝试将某些内容放入一个不存在的数组中。这就是为什么
NPE

静态块中抛出
的原因,您试图将值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使用
静态整数x[]=新整数[5]
而不是
静态int x[]

二,

改变

static {
    x[0] = 1;
}

请记住:
在使用阵列之前对其进行初始化。

static int x[];

static {
    x[0] = 1;
}
导致NullPointerException,因为中的x数组未初始化(为null)

如果访问了超出边界的索引,则会发生ArrayIndexOutOfBoundException:

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

static {
    x[20] = 1; //<-----accessing index 20
}
static int x[]=new int[10];
静止的{
x[20]=1;//它之所以抛出,是因为
x为null

x[]已声明,但未初始化。
对象具有空值之前,原语具有默认值(例如0、false等)

因此,应按如下所示进行初始化:

静态整数x[]=新整数[20];
//在声明x时


静态整数x[];
x=new int[20];
//在声明x[]之后和在代码中使用x[]之前

如果使用非法索引初始化和访问数组,则将发生

例如:
x包含20个元素,因此如果我们使用任何
索引<0

index>19
,将引发ArrayIndexOutOfBoundException


这很简单。这里x是
null
,您试图在未初始化的
数组中存储一个值。因此
NullPointerException
NullPointerException: 尝试访问未初始化对象的属性时引发此异常

阵列索引边界外异常: 当使用对象初始化数组,但尝试使用无效索引访问数组时,会引发此异常

在您的情况下,由于您尚未初始化对象,因此将获得NullPointerException。您创建了一个名为“x”的人,但未关联任何人(数组对象)

如果将第2行更改为

static int x[] = new int[];

然后您将获得ArrayIndexOutOfBoundsException而不是NullPointerException。

异常InInitializerRor是未经检查的异常

执行静态块时,静态变量初始化,如果出现任何异常,则为ExceptionInInitializeError

例如:

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.

是的,我知道我没有初始化数组。我想知道对哪个null调用哪个方法?
Runtime Exception: ExceptionInInitializerError caused by java.lang.NullPointerException.