これは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
をスローしている理由。
ArrayIndexOutOfBoundExceptionではなくNullPointerExceptionをスローしている理由。
配列を初期化していないからです。
配列を初期化する
static int x[] = new int[10];
NullPointerException の理由:
オブジェクトが必要な場合にアプリケーションがnullを使用しようとするとスローされます。これらには以下が含まれます。
配列はnull
であるため、太字でヒットします。
スローしている 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がスローされます。
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) {
}
}
修正するには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.
それは単純だ。ここで、xはnull
であり、初期化されていないarray
。Hence NullPointerException
に値を保存しようとしています。
static int x[];
static {
x[0] = 1;
}
X配列が初期化されていない(null)ため、NullPointerExceptionが発生します。
範囲外のインデックスにアクセスすると、ArrayIndexOutOfBoundExceptionが発生します。
static int x[] = new int[10];
static {
x[20] = 1; //<-----accessing index 20
}
x
配列を初期化しませんでした。変数の宣言と初期化には違いがあります。 int x[];
は、インスタンスフィールドとしてnull
のデフォルト値で初期化される変数を宣言するだけです。実際に配列を作成するには、int x[] = new int[10];
または必要なサイズ。
NullPointerException
の代わりにArrayIndexOutOfBounds
を取得する理由は、配列があり、その範囲外の位置をアドレスしようとすると後者がスローされるためですが、あなたの場合はまったく配列を持ち、存在しない配列に何かを入れようとします。 NPE
NullPointerException:初期化されていないオブジェクトのプロパティにアクセスしようとすると、この例外がスローされます
ArrayIndexOutOfBoundsException:この例外は、配列がオブジェクトで初期化されているが、無効なインデックスで配列にアクセスしようとするとスローされます。
あなたの場合、オブジェクトを初期化していないため、NullPointerExceptionが発生します。 「x」という名前の人を作成しましたが、人間(配列オブジェクト)を関連付けていません。
行2を変更すると、
static int x[] = new int[];
nullPointerExceptionの代わりにArrayIndexOutOfBoundsExceptionを取得します。
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.