Я только что потратил полчаса на то, чтобы понять это, мне удалось исправить свой код, но я не совсем понимаю, что происходит, и задался вопросом, может ли кто-нибудь пролить на это свет.
У меня есть класс типа 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;
Почему это имело значение? Я полностью смущен этим.