我正在尝试在我的数据库中为全年的每个月生成一组表。我有一个名为'DBConnection.java'的单独类,其中我从一个遵循XML格式的配置文件中获取jdbcServerType,UserName,password,serverPort以及应该创建表的数据库的名称等详细信息。通过名为RootTagsConfigList的类处理它。在此之下,我有一个验证来检查数据库是否存在,如果它不存在,请在继续创建表之前创建数据库。在我的调试会话期间,我可以看到我的配置文件正在被完美读取,并且所有上述值在从RootTagsConfigList读取后都存储在相应的变量中。
public DBConnection(RootTagsConfigList rootTagsConfigListObj) {
try {
String jdbcServerType = rootTagsConfigListObj.getRootTagsConfigList().get(0).getJDBCServerType();
String userName = rootTagsConfigListObj.getRootTagsConfigList().get(0).getUsername();
String password = rootTagsConfigListObj.getRootTagsConfigList().get(0).getPassword();
String dbserver = rootTagsConfigListObj.getRootTagsConfigList().get(0).getDbserver();
String serverPort = rootTagsConfigListObj.getRootTagsConfigList().get(0).getServerPort();
database = rootTagsConfigListObj.getRootTagsConfigList().get(0).getDatabaseName();
Class.forName("com.mysql.jdbc.Driver").newInstance();
create.execute("CREATE SCHEMA IF NOT EXISTS " +database);
String url = "jdbc:" + jdbcServerType + "://" + dbserver + ":" + serverPort + "/" + database;
conn = DriverManager.getConnection(url, userName, password);
} catch (Exception e) {
e.printStackTrace();
}
}
我的代码几天前工作正常,我能够生成整个表一年。但是,今天我运行了我的代码并在create语句中捕获了一个空指针异常。在调试期间,每次遇到create.execute时,程序都会异常。我尝试打印StackTrace并得到以下结果,
program.main.DBConnection上的。(DBConnection.java:40) 在program.Main.main(Main.java:64)
当我追溯到Main:64时,它指向dbConnectionObj,它应该将我的所有数据存储为null。然后我转到DBConnection:40(在上面的代码中有create.execute的行),它指向我的create.execute语句,该语句也为null。或者,我尝试将sql语句分配给变量并打印出打印sql语句的查询以便正确执行但在这种情况下再次遇到create.execute时,它会抛出一个空指针异常。
下面是我的Main代码:64(其中dbConnectionObj似乎为null)
try {
Statement create = null;
new ReadXMLConfig();
RootTagsConfigList rootTagsConfigListObj = new RootTagsConfigList();
dbConnectionObj = new DBConnection(rootTagsConfigListObj);
String tableAction = rootTagsConfigListObj.getRootTagsConfigList().get(0).getTableAction();
String deleteProgramId = rootTagsConfigListObj.getRootTagsConfigList().get(0).getDeleteProgramId();
String createForTheYear = rootTagsConfigListObj.getRootTagsConfigList().get(0).getcreateForTheYear();
String strStartDate = rootTagsConfigListObj.getRootTagsConfigList().get(0).getStartDateTime();
String strEndDate = rootTagsConfigListObj.getRootTagsConfigList().get(0).getEndDateTime();
再次在上面的代码中,我的所有变量都被完美地读取并存储在相应的变量中。我很惊讶代码如果在以前工作正常并且我没有做任何改变但我没有做任何改变时会给我一个错误我真的很想知道我哪里出错了,因为我主要使用python进行编码,而且还不熟悉Java。
如果我没有充分解释我的问题,请告诉我是否需要任何其他信息。任何帮助表示赞赏!
提前致谢!
答案 0 :(得分:3)
首先建立连接,而不是在构造函数DBConnection
中执行语句。
String url = "jdbc:" + jdbcServerType + "://" + dbserver + ":" + serverPort + "//" + database;
conn = DriverManager.getConnection(url, userName, password);
//I guess create is Object of Statement
Statement create= conn.createStatement();
create.execute("CREATE SCHEMA IF NOT EXISTS " +database);
答案 1 :(得分:2)
在创建statement
之前,请检查dbConnectionObj
是null
还是not null
。如果null
则问题是connection
创建类。调试并找出未创建connection
的原因。