我有一个奇怪的错误,我无法理解.size()方法似乎没有返回正确的值。
这第一段代码创建了ArrayList。
public void createResultList(String query) {
ArrayList<ArrayList<String>> data = new ArrayList();
try {
ResultSet rs = st.executeQuery(query);
ResultSetMetaData meta = rs.getMetaData();
for(int i = 0; i < meta.getColumnCount(); i++) {
data.add(i, new ArrayList<String>());
}
int x = 0;
while(rs.next()) {
for(int y = 0; y < meta.getColumnCount(); y++) {
data.get(x).add(rs.getString(y + 1));
}
x++;
}
} catch(Exception e) {
JOptionPane.showMessageDialog(null, e);
}
ResultTable result = new ResultTable(data);
JTable table = new JTable(result);
JScrollPane scrollpane = new JScrollPane(table);
add(scrollpane);
refresh();
}
这是我的TableModel类,用于在传递给表时创建表。
public class ResultTable extends AbstractTableModel {
private ArrayList<ArrayList<String>> data;
public ResultTable(ArrayList<ArrayList<String>> data) {
this.data = data;
}
public int getColumnCount() {
return data.get(0).size();
}
public int getRowCount() {
return data.size();
}
public Object getValueAt(int row, int col) {
return data.get(row).get(col);
}
}
现在问题出在ResultTable类中,现在对于一个返回一行有12列的select查询,第一个data.get(0).size()调用正确返回12,但是第二个data.size()调用错误也会返回12而不是1,这会导致越界错误,任何人都可以解释这个看似矛盾的结果吗?
答案 0 :(得分:2)
这是你在调试代码时应该很容易找到的东西......
public void createResultList(String query) {
ArrayList<ArrayList<String>> data = new ArrayList();
data是ArrayLists的ArrayList
try {
ResultSet rs = st.executeQuery(query);
返回1行12列的查询
ResultSetMetaData meta = rs.getMetaData();
for(int i = 0; i < meta.getColumnCount(); i++) {
对于记录集中的每一列,为12,您在数据中添加一个空的ArrayList
data.add(i, new ArrayList<String>());
}
导致数据是12个空Arraylists的ArrayList 这已经解释了为什么data.size()== 12
int x = 0;
while(rs.next()) {
对于记录集中的每条记录,为1
for(int y = 0; y < meta.getColumnCount(); y++) {
对于记录集中的每一列,为12,您将一个字符串添加到ArrayList,其索引与记录集相同
data.get(x).add(rs.getString(y + 1));
}
数据中的第一个ArrayList(data.get(0))将有12个字符串 数据中的所有其他ArrayLists(data.get(x),其中x> 0)将保持为空
x++;
}
导致数据是12个ArrayLists的ArrayList 其中只有第一个ArrayList有12个字符串而其他的是空的
} catch(Exception e) {
JOptionPane.showMessageDialog(null, e);
}
ResultTable result = new ResultTable(data);
JTable table = new JTable(result);
JScrollPane scrollpane = new JScrollPane(table);
add(scrollpane);
refresh();
}
答案 1 :(得分:0)
创建data
列表时,您可以创建一个子列表来保存每列的数据。
如果这是您想要做的,您应该将结果集的每一列中的数据添加到与其对应的列表中:
while(rs.next()) {
for(int y = 0; y < meta.getColumnCount(); y++) {
data.get(y).add(rs.getString(y + 1));
}
}