Инициализация статического поля Java

Я только что потратил полчаса на то, чтобы понять это, мне удалось исправить свой код, но я не совсем понимаю, что происходит, и задался вопросом, может ли кто-нибудь пролить на это свет.

У меня есть класс типа 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 . Это работает отлично, первая строка вывода из моей программы всегда "подключение к базе данных завершено", ни myDBConnection, ни myDBIndex не являются нулевыми в конце метода spawnDBConnection (), все в порядке.

Моя внешняя программа выглядит так;

//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», чтобы теперь объявление поля выглядело так;

private static DBIndex myDBIndex;

Почему это имело значение? Я полностью смущен этим.

7
задан lynks 24 July 2012 в 12:49
поделиться