我花了半个小时才弄清楚这个问题,我设法修复了我的代码,但是我不完全了解正在发生的事情,并想知道是否有人可以对此有所了解。
我有一个 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!
}
}
在spawnDBConnection完成之后会发生对searchDB的调用,我已经广泛使用了标准输出来显示这一点。但是,一旦进入searchDB方法,myDBIndex的值将为null!这是一个静态字段,并且在spawnDBConnection的结尾不为null,没有进行其他分配,现在为null :(
简单的解决方法是删除“= null”,使字段声明现在看起来像;
private static DBIndex myDBIndex;
为什么这有所作为?我对此完全感到困惑。
最佳答案
这是因为将null
分配给myDBIndex
是在
private static DBConnection myDBConnection = spawnDBConnection();
例如覆盖
spawnDBConnection
中的分配顺序为:
myDBConnection
,myDBIndex
myDBConnection = spawnDBConnection();
其中包括调用
spawnDBConnection
并将返回值分配给myDBConnection
myDBIndex
(带空)在第二个示例中,第3步不存在。