【问题标题】:Returning an Object[][] gives NullPointerException返回一个 Object[][] 给出 NullPointerException
【发布时间】:2013-06-29 17:46:36
【问题描述】:

我有一个 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;
}

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

【问题讨论】:

  • 所写的 return 语句无法生成 NullPointerException。您能否发布完整的堆栈跟踪并指出它们对应的行?

标签: object nullpointerexception return


【解决方案1】:

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

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

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

其他建议:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多