1

リストのリストに ResultSet を追加する必要があります。メソッドに渡される文字列は、SQL 選択ステートメントです。DB 接続メソッドは、このクラスの他のすべてのメソッドと完全に連携するため、ここでは問題になりません。ArrayList 宣言の一部を List に置き換えることができることはわかっていますが、この場合は問題ではないと思います。

public static ArrayList<ArrayList> selectStatement(String string) throws SQLException {
    ArrayList<ArrayList> listOfLists = null;
    ArrayList list;
    String[] record = null;
    try {
        rs = null;
        dBConnectionOpen();
        rs = st.executeQuery(string);
        ResultSetMetaData metaData = rs.getMetaData();
        int columns = metaData.getColumnCount();
        while (rs.next()) {
            list = null;
            record = new String[columns];
            for (int i = 1; i < columns; i++) {
                record[i - 1] = rs.getString(i);
            }
            list = new ArrayList(Arrays.asList(record));
            listOfLists.add(list);
        }
    } catch (Exception e) {
    } finally {
        dBConnectionClose();
    }
    return listOfLists;
}

以前もやっていたのですが、なぜか今回はうまくいきません。ここで何が欠けていますか?

4

1 に答える 1

6

値で初期化listOfListsnullます。最初からインスタンス化してみてください:

ArrayList<ArrayList> listOfLists = new ArrayList<ArrayList>();

また、それはより良いでしょう:

  • プレーンなクラス実装Listの代わりにインターフェイスを使用するArrayList
  • List<String>raw の代わりに使用しListます。
  • を使用する代わりにString[] record、データを に直接保存しますList<String>
  • 変数のスコープはできるだけ短くしてください。ループList<String> list内に直接配置できます。while

これを知っていると、コードは次のように変更できます。

List<List<String>> listOfLists = new ArrayList<List<String>>();
...
while (rs.next()) {
    List<String> list = new ArrayList<String>();
    for (int i = 1; i < columns; i++) {
        list.add(rs.getString(i));
    }
    listOfLists.add(list);
}

より詳しい情報:

于 2013-08-22T00:33:56.170 に答える