我刚花了半个小时弄清楚这件事情,我已经成功修复了我的代码,但我并不完全理解发生了什么,并想知道是否有人能够阐明一下。
我有一个名为utils的类型类,其中包含一些静态字段(例如数据库连接端点),这些字段根据手头任务而被各种其他程序使用。基本上是一个库。
以下是之前的样子(尽管还有问题);
这个searchDB的调用发生在spawnDBConnection完成之后,我已经广泛使用标准输出来展示这一点。然而,一旦进入searchDB方法,myDBIndex的值为null!它是一个静态字段,在spawnDBConnection结束时不为null,没有进行其他赋值,现在却为null :(
简单的修复方法是删除“= null”,因此字段声明现在看起来像;
为什么这会有所不同?我对这个问题感到非常困惑。
我有一个名为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都不为null,一切都如预期。
我的外部程序看起来像这样:
//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;
为什么这会有所不同?我对这个问题感到非常困惑。
final
。这样会强制你只能赋值一次,从而消除此类意外情况。 - Matt BallboneCP
。下载它看看吧,我认为你会发现它非常容易上手。 - Marko Topolnik