当前位置: 首页 > 知识库问答 >
问题:

索引自动边界。如何将结果集中的数据存储到ArrayList中?

尚阳炎
2023-03-14

所以,我有一个方法(应该)返回一个字符串,其中包含来自sqlite数据库的数据:

public String getLesson() throws ClassNotFoundException {
    ArrayList list = new ArrayList();

    int selectedColumn = tblOpenLesson.getSelectedColumn();
    int selectedRow = tblOpenLesson.getSelectedRow();
    String name = (String) tblOpenLesson.getModel().getValueAt(selectedRow, selectedColumn);

    try {
        Class.forName("org.sqlite.JDBC");
        Connection con = DriverManager.getConnection("jdbc:sqlite:sql_items.sqlite");
        Statement stmtGetLesson = con.createStatement();
        ResultSet rs = stmtGetLesson.executeQuery("SELECT * FROM lessons WHERE lesson_id  = '" + name + "';");

        if (rs.next()) {
            list.add(rs.getString("lesson"));
        }
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, e);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(openLesson.class.getName()).log(Level.SEVERE, null, ex);
    }

    return (String) list.get(0);
}

我将使用该字符串定位一个文本文件,通过该文本文件,其内容将显示在另一个类中的JTextPane上

private void btnOpenLessonPopUpActionPerformed(java.awt.event.ActionEvent evt) {                                                   

    try {
        FileReader fr = new FileReader("Lessons\\" + getLesson() + ".txt"); //this is Line 126

        try (BufferedReader br = new BufferedReader(fr)) {
            mainScreen.lessonPane.read(br, null); //  lessonPane is from another class
            br.close();
        } catch (IOException e) {
            System.out.println(e);
            this.setVisible(false);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(openLesson.class.getName()).log(Level.SEVERE, null, ex);
        }  
    } 

但是,我遇到了以下错误:

异常在线程"AWT-EventQueue-0"utton.fireIndexOutOfBoundsException: Index: 0, size: 0 atutton.java:2022ArrayLjavax.swing.Check(ArrayLandler.action)atutton.java:2348ArrayLjavax.swing.(ArrayLodel.fire)at main Wodel.java:402Ljavax.swing.Lesson(openLodel.set)at main Wodel.java:259Ljavax.swing.plaf.basic.OpenLessonPopUpActionPerform(openListener.mouse)at main Window.openLesson.access0美元(openLesson.java:19)at main Window.openLesson$1.action执行(openLesson.java:60)atjavax.swing.AbstractBjava.lang.动作执行(AbstractBjava.util.)atist.rangeAbstractButton$Hist.java:657执行(AbstractBjava.util.)atist.getDefaultButtonMist.java:433动作执行(DefaultButtonMindow.open)atesson.getDefaultButtonMesson.java:204按(DefaultButtonMindow.open)atesson.btnBasicButtonLesson.java:126在java. awt. Component. java: 252)发布(BasicButtonLister. java在java. awt上的轻量级调度程序。进程MouseEvent(Container. java: 4535)。在java. awt上的轻量级调度程序。调度事件(Container. java: 4476)。在java. awt上的容器。调度EventImpl(Container. java: 2283)。在java. awt上的窗口。调度事件(Windows. java: 2746)。在java. awt上的组件。调度事件(Component. java: 4711)。在java. awt上。EventQueue. java: 760)。在java. awt上。EventQueue3 Dollars. run(EventQueue. java: 709)在java. awt上。EventQueue3 dollars. run(EventQueue. java: 703)在java. security上。AccessController. doPrii在java. awt. EventDispatchThread. java上的事件(EventDispatchThread. java: 93)。EventDispatchThread. run(EventDispatchThread. java: 82)

我不知道为什么会这样。我对编程还是新手。

共有3个答案

马涵蓄
2023-03-14

尝试检索索引0处的值时,正在引发IndexOutOfBounds异常。这意味着没有向ArrayList中添加任何内容。调用next()时,数据很可能不是有效行。

司空鸣
2023-03-14

在不了解数据结构的情况下很难说,但是,从您的查询中:"SELECT*From课程WHERElesson_id='"name "';"似乎您正在尝试将lesson_id与您正在获得的课程的name匹配。

也可能是字符串名=(String)tblOpenLesson。getModel()。getValueAt(selectedRow,selectedColumn) 无法满足您的期望。

另一方面,您确实需要查看准备好的声明。实际上,您的应用程序易于SQL注入。

我个人也会重构代码,以便:

if (rs.next()) {
    list.add(rs.getString("lesson"));
}

成为:

if (rs.next()) {
    return rs.getString("lesson");
}

下面是:<代码>返回(字符串)列表。获取(0) 变为<代码>返回“”

穆子琪
2023-03-14

如果sql查询未返回任何行,则最后一行将引发异常,因为您的列表为空。

 return (String) list.get(0);

所以要么把它改成

if (!list.isEmpty() {
    return (String) list.get(0);
}
return null; //If list is empty

或者更好,因为您只对第一行感兴趣,所以可以跳过列表并替换

if (rs.next()) {
    list.add(rs.getString("lesson"));
}

if (rs.next()) {
    return rs.getString("lesson");
}

你仍然需要在方法结束时返回

return null;

而不是像这样使用它

try {
    String lesson = getLesson();
    if (lesson != null) {
         //open file...
    }
...
 类似资料:
  • 问题内容: 我知道这应该是简单的,我可能正直盯着问题,但我再次陷入困境,需要代码专家的帮助。 我试图从jdbc的一列中取出一行,并将它们放入数组中。 我这样做如下: creatConnection是已经定义的方法,可以执行其明显的工作。我在创建另一个结果集的同时创建了我的结果集,我将该列的字符串存储到一个数组中。然后打印出来以备不时之需。还要确保它在那里。 问题在于其将整个列存储到contactL

  • 问题内容: 如何将arrayList存储到Java中的数组中? 问题答案: 那取决于你想要什么: 现在,如果要将列表存储在数组中,则可以执行以下操作之一: 但是,如果要将列表 项 放在数组中,请执行以下一项操作: 参考:

  • 我想将结果添加到resultset,并使用table显示结果,这是我的java代码 错误显示"未找到列'Janunary'。" 很抱歉我没有获得足够的声誉,所以我将存储过程的结果写如下。 查询代码:

  • 我试图将公共静态void readGrades()的结果存储到方法数组int[]grades中。但是我没有这样做。我试过数组列表和其他东西,但不幸的是。

  • 问题内容: 说说我有一些小树而不是文档,我需要将它们存储在Lucene索引中。我该怎么做呢? 树中的一个示例节点: 在上面的节点中,“数据”成员变量是用空格分隔的字符串,因此需要全文搜索。“类型”成员变量只是一个单词。 搜索查询本身将是一棵树,并将搜索每个节点中的数据和类型,以及树的结构以查找匹配项。在与子节点匹配之前,查询必须首先与父节点数据和类型匹配。可以对数据值进行近似匹配。 索引此类数据的