2017-06-08 2 views
1

bekomme ich folgende Fehlermeldung, wenn meine Anwendung starten:Nullpointer mit HikariCP

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

Hier ist, wie ich habe meine Datenbank Klasse einrichten:

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

} 

Und hier meine Modellklasse ist, dass Trigger der Fehler:

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

ich denke MyAppModel Verbindung gibt null zurück, und ich bin Umgang mit dem TryCatch Umgang falsch, aber ich bin nicht ganz sicher, warum es null zurückgibt. Was mache ich falsch?

Ich verstehe das Konzept einer NullPointerException, aber nicht, warum meine Anwendung mir diesen Fehler gibt.

+0

Können Sie mir auf die doppelte Frage zeigen? – kinx

Antwort

-1

In Ihrer Funktion getConn() rufen Sie ds.getConnection() auf, aber die Variable ds wurde noch nie in Ihrer Klasse erstellt. Stellen Sie sicher, dass Sie das HikariDataSource-Objekt mit dem Namen ds initialisieren.

Leider habe ich von den Objekten verwechselt wurde verwendet, um die DBConfig ändern zurück zu dem, was man hatte, und erstellen Sie einfach die neue HikariDataSource Objekt seinen Konstruktor nach den javadocs ->HikariDataSource (HikariConfig Konfiguration)

Deshalb Sie müssen die Initialisierung der Objekte wechseln und Ihr dbConfig-Objekt im Konstruktor Ihres HikariDataSource-Objekts verwenden.

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

Danke, wenn Sie dies ändern, geben Sie ds.getConnection(); geht kaputt? – kinx

+0

Ich habe den Code geändert, ich habe die Objekte, die Sie verwenden, völlig durcheinander gebracht. Sie müssen nur das ds-Objekt mit seinem Konstruktor initialisieren @kinx –

+0

Danke, Ich habe den Code zu Ihrem Vorschlag geändert, aber ich bekomme immer noch den gleichen Fehler. Bearbeitete Frage mit dem Update. – kinx