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(“”)时未分配/初始化