我刚刚花了半个小时来解决这个问题,我已经设法修复了我的代码,但我并不完全理解发生了什么,并且想知道是否有人可以对此有所了解。
我有一个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 都不是空的,一切都应该是这样。
我的外部程序如下所示;
//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;
为什么会有所作为?我被这个彻底搞糊涂了。