0

我有一个 Access 数据库,我需要检索除第一个和最后一个以外的所有字段并将其显示在 JTable 中。当我创建我的 Object[][] 时一切正常,但是当我返回它时,我得到一个 NullPointerException。我试图通过打印整个对象来查找数据库中可能存在空值的位置,但这工作正常并且没有值是空的。为什么返回 Object[][] 会给我一个 NullPointerException,我该如何解决?

堆栈跟踪是:线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException

    public Object [] [] SetTrainingLogTable() throws SQLException
    {

    DatabaseConnection connection = new DatabaseConnection();

    //Retrieves all the data from the TrainingLog table
    ResultSet resultset = connection.SelectStatements("SELECT * FROM TrainingLog");

    //Retrieves the number of entries
    ResultSet numberofworkouts = connection.SelectStatements("SELECT COUNT(*) FROM    TrainingLog");

    int count = numberofworkouts.getInt(1);
    number = count;

    String[][] table = new String [count] [6];   

    //Number to incriment for while loops
    int row = 0;

    String date = "";

    while(row<count)
    {
        date = resultset.getString(2);
        table [row][0] = calculate.RefineDate(date); 
        table [row][1] = resultset.getString(3);
        table [row][2] = resultset.getString(4);
        table [row][3] = resultset.getString(5);
        table [row][4] = resultset.getString(6);
        table [row][5] = resultset.getString(7);
        resultset.next();  
        row++;
    }

    Object[][] data = table;

    connection.close();

    return data;
}

我运行了一个调试器,它只在运行返回行时给出错误。

4

1 回答 1

0

最好发布堆栈跟踪并告诉哪一行引发了错误。但是,编写此类代码的典型方式是:

Connection con = ...;
Statement  st  = ...;
ResultSet  rs  = ...;
while (rs.next()) {
    // ...
}

结果集开始指向第一行之前rs.next()返回是否存在下一行,如果存在则前进。你能用那种风格重写它吗?

其他建议:

  1. 你可以创建一个实际的对象类型而不是Object[]用来存储每一行​​的数据吗?调用它Workout
  2. 你可以用 aList<Workout>代替你的Object[][]吗?
  3. 日期是作为 SQL DATE 还是 TIMESTAMP 存储在数据库中的?然后,不要将其转换为 Java String:使用java.sql.Dateor java.util.Date。在工作中,我有一个使用字符串作为日期的大型旧程序,它使用不同的格式在不同时间转换值。真是太惨了。
  4. 不要使用SELECT *. 给出要返回的列的名称。使用rs.getString("column_name")语法。
  5. 无需为返回的表设置一个变量并立即为其设置另一个变量。
  6. 关闭连接或语句应该在 finally 块中完成,或者通过 try-with-resources 完成。
于 2013-07-02T11:41:42.840 回答