有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MySQL:超出范围,但该列不是最后一列?

在花了很长时间找出我的代码出了什么问题后,我决定继续寻求帮助。到目前为止,这是导致错误的代码:

try {
    ResultSet rs = statement.executeQuery("SELECT `message` FROM `notifications` WHERE `active`='1'");
    List<String> messages = new ArrayList<String>();
    int index = 1;
    if (rs.next()) {
        while (!rs.isLast()) {
        messages.add(rs.getString(index));
        index ++;
        } 
        if (rs.isLast()) {
        messages.add(rs.getString(index));
        }
    }
    return messages.toArray(new String[messages.size()]);
} catch (Exception localException) {
    if (localException instanceof NullPointerException) {
        /* ignore for now */
        localException.printStackTrace();
    } else {
        localException.printStackTrace();
    }
}

错误告诉我该列超出范围,但当我查看数据库时,它不是

java.sql.SQLException: Column Index out of range, 2 > 1.

有什么建议吗?提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    ^{}方法只确定您是否在最后一行,而不是最后一列。使用index的方法是迭代同一行上的所有列

    确定列数的方法是从ResultSet中获取ResultSetMetaData对象,并使用ResultSet上的^{} methodResultSetMetaData上的^{} method从中获取列数。然后你可以用它来循环浏览你的专栏

  2. # 2 楼答案

    里面

     if (rs.isLast()) {
        messages.add(rs.getString(index));
        }
    

    在这个语句中,索引将是2,但结果集只包含一列

    当你说rs.getString(2)时,它将获取与第二列相关的值

    应该是:

    ResultSet rs = statement.executeQuery("SELECT `message` FROM `notifications` WHERE `active`='1'");
    List<String> messages = new ArrayList<String>();
    int index = 1;
    while (rs.next()) {
        messages.add(rs.getString(index));
    }
    

    注意:最佳做法是基于列名而不是索引获取值。我相信您认为getString(index)访问了该行,通过列名调用它会为您澄清这一点

    ResultSet rs = statement.executeQuery("SELECT `message` FROM `notifications` WHERE `active`='1'");
    List<String> messages = new ArrayList<String>();
    String column = "message";
    while (rs.next()) {
        messages.add(rs.getString(column));
    }
    
  3. # 3 楼答案

    在查询中,SELECT子句中只有一列message。从java代码中删除index++以消除异常,因为rs.getString(index)正在尝试获取查询结果中不存在的列号2的值