【发布时间】:2016-12-04 17:33:59
【问题描述】:
我在我的项目中使用 JavaFX,我有两个类 - MainApp 类和 Database 类。
非常简化的实现如下所示:
public class MainApp extends Application {
@Override
public void start(Stage stage) throws Exception {
// Getting username & password doing some initialization, etc.
Database.setUserName(username);
Database.setPassword(password);
Database.testConnection();
}
// This method was pretty much generated by IDE
public static void main(String[] args)
{
launch(args);
}
}
仅Database类实现的相关部分如下(注意我已经声明并实现了出现在提到的方法中的变量,为了保持代码简短,我只是不在这里粘贴它们)
public class Database {
private static OracleDataSource dataSource;
static {
try {
dataSource = new OracleDataSource();
dataSource.setURL("myjdbcaddress");
dataSource.setUser(userName);
dataSource.setPassword(password);
System.out.print("Static block executed...");
}
catch (SQLException e)
{
System.out.print("Static block caught...");
throw new ExceptionInInitializerError("Initial Database Connection not established. Sorry.");
}
}
public static Connection getConnection()
{
Connection conn = null;
try
{
conn = dataSource.getConnection();
if (conn != null)
isConnected = true;
}
catch (SQLException e)
{
e.printStackTrace();
}
return conn;
}
}
我收到空指针异常是因为:Database 类中的静态块在重写 start() 方法后执行。因此,当我访问数据库类的属性时,它们还没有被初始化。
有没有办法在启动方法之前强制调用静态块?我选择了错误的方法吗?我应该在 start() 方法之外的其他地方开始使用数据库吗?
【问题讨论】:
标签: java javafx static-block