私はこのことを理解するのに30分を費やしました.コードを修正することができました.
手元のタスクに応じて他のさまざまなプログラムで使用されるいくつかの静的フィールド (データベース接続エンドポイントなど) を含む utils 型クラスがあります。基本的に図書館。
これは以前の外観です (まだ壊れています)。
//DBUtils.java
public final class DBUtils {
private static DBConnection myDBConnection = spawnDBConnection();
private static DBIndex myDBIndex = null;
private static DBConnection spawnDBConnection() {
//connect to the database
//assign a value to myDBIndex (by calling a method on the DBConnection object) <- IMPORTANT
//myDbIndex NOT NULL HERE
System.out.println("database connection completed");
//return the DBConnection object
}
public static searchDB(String name) {
//use the myDBIndex to find a row and return it
}
}
簡単に言うと、静的な spawnDBConnection() メソッドを使用して、myDBConnectionとmyDBIndexの両方に値を割り当てています。これは完全に機能します。プログラムからの最初の出力行は常に「データベース接続が完了しました」であり、spawnDBConnection() メソッドの最後で myDBConnection も myDBIndex も null ではなく、すべてが正常です。
私の外部プログラムは次のようになります。
//DoSomethingUsefulWithTheDatabase.java
public final class DoSomethingUsefulWithTheDatabase {
public static void main(String args[]) {
DBUtils.searchDB("John Smith"); //fails with NullPointerException on myDBIndex!
}
}
この searchDB への呼び出しは、spawnDBConnection が終了した後に発生します。これを示すために、標準出力を広範囲に使用しました。ただし、searchDB メソッド内に入ると、myDBIndex の値は null です。これは静的フィールドであり、spawnDBConnection の終わりまでに null ではなく、他の割り当ては行われておらず、現在は null です:(
簡単な修正は、「= null」を削除することでした。これにより、フィールド宣言は次のようになります。
private static DBIndex myDBIndex;
なぜそれが違いを生んだのですか?私はこれに完全に混乱しています。