HikariCP 的 NullPointerException
NullPointerException with HikariCP
启动我的应用程序时出现以下错误:
java.lang.NullPointerException
at me.MyApp.MyApp.Database.getConn(Database.java:30) ~[?:?]
at me.MyApp.MyApp.Models.MyAppModel.<init>(MyAppModel.java:18) ~[?:?]
这是我设置数据库的方式class:
public class Database {
private static MyApp instance = MyApp.getInstance();
private static Config config = new Config();
private static HikariDataSource ds = new HikariDataSource();
static {
HikariConfig dbConfig = new HikariConfig();
dbConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + config.get("database.database"));
dbConfig.setUsername(config.get("database.username"));
dbConfig.setPassword(config.get("database.password"));
dbConfig.setDriverClassName("com.mysql.jdbc.Driver");
dbConfig.addDataSourceProperty("cachePrepStmts", "true");
dbConfig.addDataSourceProperty("prepStmtCacheSize", "250");
dbConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
}
public static Connection getConn() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
这是触发错误的我的模型 class:
public class MyAppModel {
private MyApp instance = MyApp.getInstance();
private Connection connection;
public MyAppModel() {
connection = Database.getConn();
}
public void createTable() {
BukkitRunnable r = new BukkitRunnable() {
@Override
public void run() {
try {
String sql = "CREATE TABLE IF NOT EXISTS `myapp` ( " +
" `id` INT NOT NULL AUTO_INCREMENT ," +
"`uuid` VARCHAR(255) NOT NULL ," +
" `join_message` VARCHAR(255) NOT NULL ," +
" `quit_message` VARCHAR(255) NOT NULL ," +
" `change_points` INT NOT NULL," +
" `last_modified` TIMESTAMP NOT NULL," +
" PRIMARY KEY (`id`)" +
")";
Statement statement = connection.createStatement();
statement.executeUpdate(sql);
} catch(SQLException e) {
e.printStackTrace();
}
}
};
r.runTaskAsynchronously(instance);
}
}
我认为 MyAppModel 连接 returns 为 null 并且我处理的 TryCatch 处理错误,但我不完全确定它返回 null 的原因。我究竟做错了什么?
我理解 NullPointerException 的概念,但不明白为什么我的应用程序会给我这个错误。
在您的 getConn() 函数中,您调用了 ds.getConnection(),但变量 ds 从未在您的 class 中创建。确保初始化名为 ds.
的 HikariDataSource 对象
抱歉,我对正在使用的对象感到困惑,所以将 dbConfig 改回您拥有的,并根据 javadocs 使用其构造函数创建新的 HikariDataSource 对象 -> HikariDataSource(HikariConfig 配置)
因此您需要切换对象的初始化并在 HikariDataSource 对象的构造函数中使用 dbConfig 对象。
private static HikariConfig dbConfig;
static { //keep this the same
dbConfig = new HikariConfig();
dbConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + config.get("database.database"));
dbConfig.setUsername(config.get("database.username"));
dbConfig.setPassword(config.get("database.password"));
dbConfig.setDriverClassName("com.mysql.jdbc.Driver");
dbConfig.addDataSourceProperty("cachePrepStmts", "true");
dbConfig.addDataSourceProperty("prepStmtCacheSize", "250");
dbConfig.addDataSourceProperty( "prepStmtCacheSqlLimit", "2048");
}
private static HikariDataSource ds = new HikariDataSource(dbConfig); //intialize here with your newly created HikariConfig object
启动我的应用程序时出现以下错误:
java.lang.NullPointerException
at me.MyApp.MyApp.Database.getConn(Database.java:30) ~[?:?]
at me.MyApp.MyApp.Models.MyAppModel.<init>(MyAppModel.java:18) ~[?:?]
这是我设置数据库的方式class:
public class Database {
private static MyApp instance = MyApp.getInstance();
private static Config config = new Config();
private static HikariDataSource ds = new HikariDataSource();
static {
HikariConfig dbConfig = new HikariConfig();
dbConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + config.get("database.database"));
dbConfig.setUsername(config.get("database.username"));
dbConfig.setPassword(config.get("database.password"));
dbConfig.setDriverClassName("com.mysql.jdbc.Driver");
dbConfig.addDataSourceProperty("cachePrepStmts", "true");
dbConfig.addDataSourceProperty("prepStmtCacheSize", "250");
dbConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
}
public static Connection getConn() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
这是触发错误的我的模型 class:
public class MyAppModel {
private MyApp instance = MyApp.getInstance();
private Connection connection;
public MyAppModel() {
connection = Database.getConn();
}
public void createTable() {
BukkitRunnable r = new BukkitRunnable() {
@Override
public void run() {
try {
String sql = "CREATE TABLE IF NOT EXISTS `myapp` ( " +
" `id` INT NOT NULL AUTO_INCREMENT ," +
"`uuid` VARCHAR(255) NOT NULL ," +
" `join_message` VARCHAR(255) NOT NULL ," +
" `quit_message` VARCHAR(255) NOT NULL ," +
" `change_points` INT NOT NULL," +
" `last_modified` TIMESTAMP NOT NULL," +
" PRIMARY KEY (`id`)" +
")";
Statement statement = connection.createStatement();
statement.executeUpdate(sql);
} catch(SQLException e) {
e.printStackTrace();
}
}
};
r.runTaskAsynchronously(instance);
}
}
我认为 MyAppModel 连接 returns 为 null 并且我处理的 TryCatch 处理错误,但我不完全确定它返回 null 的原因。我究竟做错了什么?
我理解 NullPointerException 的概念,但不明白为什么我的应用程序会给我这个错误。
在您的 getConn() 函数中,您调用了 ds.getConnection(),但变量 ds 从未在您的 class 中创建。确保初始化名为 ds.
的 HikariDataSource 对象抱歉,我对正在使用的对象感到困惑,所以将 dbConfig 改回您拥有的,并根据 javadocs 使用其构造函数创建新的 HikariDataSource 对象 -> HikariDataSource(HikariConfig 配置)
因此您需要切换对象的初始化并在 HikariDataSource 对象的构造函数中使用 dbConfig 对象。
private static HikariConfig dbConfig;
static { //keep this the same
dbConfig = new HikariConfig();
dbConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + config.get("database.database"));
dbConfig.setUsername(config.get("database.username"));
dbConfig.setPassword(config.get("database.password"));
dbConfig.setDriverClassName("com.mysql.jdbc.Driver");
dbConfig.addDataSourceProperty("cachePrepStmts", "true");
dbConfig.addDataSourceProperty("prepStmtCacheSize", "250");
dbConfig.addDataSourceProperty( "prepStmtCacheSqlLimit", "2048");
}
private static HikariDataSource ds = new HikariDataSource(dbConfig); //intialize here with your newly created HikariConfig object