起動すると、私のプログラムはすぐにExceptionInInitializerErrorをスローします。ソースはこのメソッドからのものです:
public static void errorMessage(String input) {
System.err.println("[ERROR] " + form.format(date) + " - " + Thread.currentThread().getStackTrace()[3].getClassName() + ": " + input);
}
文字列のさまざまな部分を印刷したところ、form.format(date)を呼び出したときにのみエラーがスローされることがわかりました。nullと書いてあります。唯一の問題は、日付と形式の両方がこのメソッドのすぐ上で静的に宣言されていることです。
public static Date date = new Date();
public static DateFormat form = new SimpleDateFormat("HH:mm:ss");
いくつかのマイナーなバグ修正の後、エラーが突然スローされ始めました。何が間違っているのか、これで何かが間違っている可能性があるのか、私にはわかりません。つまり、同じクラスで静的に宣言された変数を呼び出しています。技術的には、nullであってはなりませんが、nullです。なぜこのエラーがスローされるのか、誰か考えがありますか?コンソール出力は次のとおりです。
java.lang.ExceptionInInitializerError
at A$$OpSystem.getOperatingSystem(A$.java:98)
at A_.<clinit>(A_.java:19)
Caused by: java.lang.NullPointerException
at A$.errorMessage(A$.java:72)
at A$.loadCursor(A$.java:84)
at A$.<clinit>(A$.java:62)
... 2 more
Exception in thread "main"
ちなみに、A $ .OpSystem.getOperatingSystemは、A $ .errorMessage ...を呼び出すため、ここにのみ表示されています。
そして、私は以前にこの問題を抱えていました。静的に宣言された変数が、呼び出されたときにnullのままであると実際に宣言されなかったときでした。現在、nullであるとは想定されていませんが、nullです。だから私はそれを引き起こしているのか分かりません。アイデア?
しかし、これは静的変数が実際にどのようにロードされるかについて教育するのに良い時期だと思います...
編集:「loadCursor」を呼び出す静的カーソルオブジェクトを別のクラスに移動しても、例外はスローされないようです。何?
この状況をテストしましたが、エラーは返されませんか?
public class StaticMethodTesting {
public static int i = getInt();
public static int getInt() {
return getAnotherInt();
}
public static int getAnotherInt() {
return 0;
}
public static void main(String[]args) {
System.out.println("Hi");
}
}