2017-06-08 71 views
1

开始我的应用程序时,我得到了以下错误:NullPointerException异常与HikariCP

java.lang.NullPointerException 
     at me.MyApp.MyApp.Database.getConn(Database.java:30) ~[?:?] 
     at me.MyApp.MyApp.Models.MyAppModel.<init>(MyAppModel.java:18) ~[?:?] 

这里是我怎么设置我的数据库类:

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; 
    } 

} 

这里是我的模型类触发器错误:

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连接返回null,我处理TryCatch处理错误,但我是不完全确定它为什么返回null。我究竟做错了什么?

我理解NullPointerException的概念,但不知道为什么我的应用程序给我这个错误。

+0

你能指我一个重复的问题吗? – kinx

回答

-1

在您的getConn()函数中调用ds.getConnection(),但变量ds从未在您的类中创建过。确保初始化名为ds的HikariDataSource对象。

对不起,我是由对象混淆使用,从而改变DBCONFIG回你有什么,并使用其构造根据的javadoc只需要创建一个新的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 
+0

谢谢,当更改为此时,返回ds.getConnection();休息? – kinx

+0

我改变了代码,我完全搞砸了你正在使用的对象。你只需要使用它的构造函数初始化ds对象@kinx –

+0

谢谢,我已经将代码更改为您的建议,但我仍然得到相同的错误。编辑更新的问题。 – kinx