返回Object [] []会产生NullPointerException

时间:2013-07-02 11:21:09

标签: object nullpointerexception return

我有一个Access数据库,我需要检索除第一个和最后一个之外的所有字段并将其显示在JTable中。当我创建我的Object [] []时,一切都运行得很好但是当我返回它时,我得到一个NullPointerException。我试图通过打印整个对象来找到数据库中可能存在空值的位置但是工作正常且没有值为null。为什么要返回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;
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

其他建议:

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