web-dev-qa-db-ja.com

java.lang.ExceptionInInitializerError原因:Java.lang.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をスローしている理由。

7

ArrayIndexOutOfBoundExceptionではなくNullPointerExceptionをスローしている理由。

配列を初期化していないからです。

配列を初期化する

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

NullPointerException の理由:

オブジェクトが必要な場合にアプリケーションがnullを使用しようとするとスローされます。これらには以下が含まれます。

  • Nullオブジェクトのインスタンスメソッドを呼び出します。
  • Nullオブジェクトのフィールドへのアクセスまたは変更。
  • 配列のようにnullの長さを取得します。
  • nullのスロットへのアクセスまたは変更は、あたかも配列であるかのように。
  • スロー可能な値であるかのようにnullをスローします。

配列はnullであるため、太字でヒットします。

12
Suresh Atta

スローしている NullPointerException なぜならx is null

x []は宣言されていますが、初期化されていません。
Before initialization、 オブジェクトにはnull値があり、プリミティブにはデフォルト値があります(例: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 は、配列が初期化され、不正なインデックスでアクセスされた場合に発生します。

e.g:
xには20個の要素が含まれているため、index < 0または
index > 19、ArrayIndexOutOfBoundExceptionがスローされます。

3

NullPointerExceptionstatic 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) {
}
}

修正するには2つの方法があります。

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.

2
MouseLearnJava

それは単純だ。ここで、xはnullであり、初期化されていないarray。Hence NullPointerExceptionに値を保存しようとしています。

1
user3099347
static int x[];

static {
    x[0] = 1;
}

X配列が初期化されていない(null)ため、NullPointerExceptionが発生します。

範囲外のインデックスにアクセスすると、ArrayIndexOutOfBoundExceptionが発生します。

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

static {
    x[20] = 1; //<-----accessing index 20
}
1
Melquiades

x配列を初期化しませんでした。変数の宣言と初期化には違いがあります。 int x[];は、インスタンスフィールドとしてnullのデフォルト値で初期化される変数を宣言するだけです。実際に配列を作成するには、int x[] = new int[10];または必要なサイズ。

NullPointerExceptionの代わりにArrayIndexOutOfBoundsを取得する理由は、配列があり、その範囲外の位置をアドレスしようとすると後者がスローされるためですが、あなたの場合はまったく配列を持ち、存在しない配列に何かを入れようとします。 NPE

1
svz

NullPointerException:初期化されていないオブジェクトのプロパティにアクセスしようとすると、この例外がスローされます

ArrayIndexOutOfBoundsException:この例外は、配列がオブジェクトで初期化されているが、無効なインデックスで配列にアクセスしようとするとスローされます。

あなたの場合、オブジェクトを初期化していないため、NullPointerExceptionが発生します。 「x」という名前の人を作成しましたが、人間(配列オブジェクト)を関連付けていません。

行2を変更すると、

static int x[] = new int[];

nullPointerExceptionの代わりにArrayIndexOutOfBoundsExceptionを取得します。

0
Sathesh

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.
0
Raman Gupta