Java 在Derby嵌入式模式下创建表时出现NullPointerException
我得到了一个错误:Java 在Derby嵌入式模式下创建表时出现NullPointerException,java,derby,Java,Derby,我得到了一个错误: Exception in thread "main" java.lang.NullPointerException at com.deanchester.minos.utils.DatabaseManager.createTables(DatabaseManager.java:59) at com.deanchester.minos.tests.testAddContestantMethod.main(testAddContestantMethod.java:21) 我使用
Exception in thread "main" java.lang.NullPointerException
at com.deanchester.minos.utils.DatabaseManager.createTables(DatabaseManager.java:59)
at com.deanchester.minos.tests.testAddContestantMethod.main(testAddContestantMethod.java:21)
我使用以下方法创建连接:
private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver";
private static final String protocol = "jdbc:derby:";
private static final Properties props = new Properties();
public static Connection getDatabaseConnection() {
try {
if(conn==null || conn.isClosed()) {
try {
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(protocol+"minos;create:true;",props);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
我使用以下方法创建表:
private static final String tablesSQL = "CREATE TABLE `contestants` (`id` int(11) NOT NULL AUTO_INCREMENT,`first_name` varchar(100) DEFAULT NULL,`last_name` varchar(100) DEFAULT NULL, `entry` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `finalTimes` ( `id` int(11) NOT NULL AUTO_INCREMENT,`contestant` int(11) DEFAULT NULL,`time` int(11) DEFAULT NULL,PRIMARY KEY (`id`), KEY `contestant` (`contestant`), CONSTRAINT `finaltimes_ibfk_1` FOREIGN KEY (`contestant`) REFERENCES `contestants` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `heatTimes` (`id` int(11) NOT NULL AUTO_INCREMENT,`contestant` int(11) DEFAULT NULL,`time` int(11) DEFAULT NULL,PRIMARY KEY (`id`),CONSTRAINT `heattimes_ibfk_1` FOREIGN KEY (`id`) REFERENCES `contestants` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;";
public static void createTables(){
try {
PreparedStatement ps = conn.prepareStatement(tablesSQL);
ps.executeUpdate();
System.out.println("Tables Created");
} catch (SQLException e) {
e.printStackTrace();
}
}
那我为什么会犯这个错误呢?我的CREATETABLES SQL直接来自MYSQL数据库的转储。我离开MYSQL是因为我的软件将在独立的机器上运行,我不想安装其他任何东西。这就是为什么ApacheDerby是一个不错的选择
编辑这是我的小测试课:
public class testAddContestantMethod {
public static void main(String[] args){
Contestant cont = new Contestant("Dean","Chester","Mazey");
DatabaseManager.createTables();
cont.writeContestantToDatabase();
DatabaseManager.shutdownDatabase();
}
}
如果
getDatabaseConnection
中存在异常,您只需将其打印出来-这意味着在尝试创建连接时很可能存在异常,将conn
保留为null
,从而导致createTables
中出现NullPointerException
此外,您还没有显示实际调用getDatabaseConnection
的任何内容
我建议您使getDatabaseConnection
传播异常(如果有),然后从createTables
调用它
(通常,简单地打印出一个异常,然后假装它没有发生,这不是一个合适的错误处理策略。)如果在
getDatabaseConnection
中有一个异常,您只是简单地打印出来,这意味着在尝试创建连接时很可能出现异常,将conn
保留为null
,导致createTables
中出现NullPointerException
此外,您还没有显示实际调用getDatabaseConnection
的任何内容
我建议您使getDatabaseConnection
传播异常(如果有),然后从createTables
调用它
(通常,简单地打印出一个异常,然后假装它没有发生,这不是一个合适的错误处理策略。)这是一个
NullPointerException
,因为我对连接使用了错误的变量。在我呼叫conn.prepareStatement(“”)时未分配/初始化这是一个NullPointerException
,因为我为连接使用了错误的变量。在我呼叫conn.prepareStatement(“”)时未分配/初始化代码>