SQLite:ResultSet 返回 SQLException

3
我有以下数据库ShorthandText
textid | text
-------------------------- 
1      | just a test
2      | just another test  

我使用以下代码尝试返回“text”列中的两个字符串。
public List<String> executeSQLWithMulipleReturns(String sql) throws SQLException{
    List<String> results = null;
    connection = ConnectDb();
    stat = connection.createStatement();
    resultSet = stat.executeQuery(sql); // sql = "SELECT text FROM ShorthandText;"
    while(resultSet.next()){
        results.add(resultSet.getString(resultSet.getRow()));
        System.out.println(resultSet.toString());
    }

    closeAll(); // closes all connections         
    return results;
}

但是我遇到了以下错误。
java.sql.SQLException: column 2 out of bounds [1,1]
at org.sqlite.RS.checkCol(RS.java:64)
at org.sqlite.RS.markCol(RS.java:71)
at org.sqlite.RS.getString(RS.java:245)
at Java.ConnectToDatabase.executeSQLWithMulipleReturns(ConnectToDatabase.java:46)
at GUI.ShorthandText.jButton1ActionPerformed(ShorthandText.java:123)
at GUI.ShorthandText.access$000(ShorthandText.java:18)
at GUI.ShorthandText$2.actionPerformed(ShorthandText.java:82)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
......

以下内容发生在这一行:results.add(resultSet.getString(resultSet.getRow()));

请问有谁能解释一下为什么我会遇到这个错误?

编辑:空指针异常

代码:

while(resultSet.next()){
        results.add(resultSet.getString("text"));
        System.out.println(resultSet.toString());
    }

while(resultSet.next()){
        results.add(resultSet.getString(1));
        System.out.println(resultSet.toString());
    }

两者都会抛出此异常

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Java.ConnectToDatabase.executeSQLWithMulipleReturns(ConnectToDatabase.java:46)
at GUI.ShorthandText.jButton1ActionPerformed(ShorthandText.java:123)
at GUI.ShorthandText.access$000(ShorthandText.java:18)
at GUI.ShorthandText$2.actionPerformed(ShorthandText.java:82)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
.......
2个回答

4
问题在这里:
results.add(resultSet.getString(resultSet.getRow()));

resultSet.getString方法需要传入列索引作为参数,但您却传递了resultSet.getRow()

如果您想将ID获取到results中,请使用:

results.add(resultSet.getString("textid"));

或者

results.add(resultSet.getString(0));

如果你想把文本放入 results 中,你应该使用以下代码:

results.add(resultSet.getString("text"));

或者

results.add(resultSet.getString(1));

更新

哦,我的天,这太简单了!你实际上有两个问题。我们已经解决了第一个问题。这是你的第二个问题:

List<String> results = null;

List<String> results 还没有被初始化,因此出现了 NullPointerException。这一行应该改为:

List<String> results = new ArrayList<String>();

这会解决它。

但是如果我尝试像这样写 'results.add(resultSet.getString(1));',即使数据库中有数据,我仍然会得到一个空指针异常? - undefined
我也尝试了这个,但还是出现了空指针异常...我会将此添加到我的答案的编辑中。 - undefined
我在来这里之前尝试过这两种方法,但都在我的编辑中出现了异常...这让我相信数据库中没有字段,但我已经多次检查过,它们确实存在。 - undefined
@HipHipArray:如果你从Javadoc中阅读next()方法的描述,它是依赖于供应商的,我强烈感觉,无论你使用的数据库驱动程序是否支持next()方法。 - undefined
@Adrian:没错,问题就在这儿,结果没有被初始化……本来应该自己注意到的,但是一直以为是数据库本身的问题 :-S 感谢你的帮助 :) - undefined

1

getRow返回结果集中的行数

您有一个只有一列的结果集

第一次迭代results.add(resultSet.getString(resultSet.getRow()));使用索引1调用getString(将起作用)

第二次迭代results.add(resultSet.getString(resultSet.getRow()));使用索引2调用getString(将失败,因为结果集中只有一列)

我认为您应该执行results.add(resultSet.getString(1));

每次从结果集中读取时,您都希望获取第一个项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接