0

最初と最後を除くすべてのフィールドを取得して JTable に表示する必要がある Access データベースがあります。Object[][] を作成するとすべて問題なく動作しますが、それを返すと NullPointerException が発生します。オブジェクト全体を出力して、データベース内で null 値が存在する可能性がある場所を見つけようとしましたが、それは正常に機能し、null 値はありません。Object[][] を返すと NullPointerException が発生するのはなぜですか?どうすれば修正できますか?

スタック トレース: Exception in thread "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. List<Workout>あなたの代わりにaを使用できますObject[][]か?
  3. 日付は SQL DATE または TIMESTAMP としてデータベースに保存されていますか? 次に、それを Java に変換しないでくださいString:java.sql.Dateまたはを使用しますjava.util.Date。職場では、日付に文字列を使用する大規模な古いプログラムがあり、さまざまな形式を使用してさまざまな時間に値を変換しています。かなり惨めです。
  4. 使用しないでくださいSELECT *。返す列の名前を指定します。構文を使用しrs.getString("column_name")ます。
  5. 1 つの変数を返されたテーブルに設定し、すぐに別の変数をそれに設定する必要はありません。
  6. 接続またはステートメントを閉じるには、finally ブロックで、または try-with-resources を使用する必要があります。
于 2013-07-02T11:41:42.840 に答える