我花了半个小时才弄清楚这个问题,我设法修复了我的代码,但是我不完全了解正在发生的事情,并想知道是否有人可以对此有所了解。

我有一个 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中的分配

顺序为:
  • 声明字段myDBConnectionmyDBIndex
  • 初始化myDBConnection = spawnDBConnection();
    其中包括调用spawnDBConnection并将返回值分配给myDBConnection
  • 初始化myDBIndex(带空)

  • 在第二个示例中,第3步不存在。

    08-25 06:41