开发者社区 问答 正文

IndexOutOfBounds。您应该如何将结果集中的数据存储到ArrayList中?

因此,我有一个方法(应该)返回一个包含来自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”中的异常

java.lang.IndexOutOfBoundsException:Index:0,Size:0 at java.util.ArrayList.rangeCheck(ArrayList.java:657)at java.util.ArrayList.get(ArrayList.java) :433)在mainWindow.openLesson.getLesson(openLesson.java:204)在mainWindow.openLesson.btnOpenLessonPopUpActionPerformed(openLesson.java:126)在mainWindow.openLesson.access $ 000(openLesson.java:19)在mainWindow.openLesson $ 1.actionPerformed (openLesson.java:60)at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)at javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2348)at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel。 javax:swing.plaf.basic上的javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)上的java:402)。java.awt.Component.processMouseEvent(Component.java:6539)的BasicButtonListener.mouseReleased(BasicButtonListener.java:252)在java.awt.Component.processEvent(Component)的javax.swing.JComponent.processMouseEvent(JComponent.java:3324) .java:6304),位于java.awt.Container.processEvent(Container.java:2239),位于java.awt.Component.dispatchEventImpl(Component.java:4889),位于java.awt.Container.dispatchEventImpl(Container.java:2297)在java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)在java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)在java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)在java.awt.Component.dispatchEvent(Component.java:4711)位于java.awt.Window.dispatchEventImpl(Window.java.awt.Container.dispatchEventImpl(Container.java:2283)的LightweightDispatcher.dispatchEvent(Container.java:4476)java:2746)at java.awt.Component.dispatchEvent(Component.java:4711)at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)at java.awt.EventQueue.access $ 500(EventQueue.java:97)在java.awt.EventQueue $ 3.run(EventQueue.java:709)在java.awt.EventQueue $ 3.run(EventQueue.java:703)在java.security.AccessController.doPrivileged(Native Method)在java.security.ProtectionDomain java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)处的$ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)在java.awt.EventQueue处java.awt.EventQueue $ 4.run(EventQueue.java:733)处java.security.ProtectionDomain $ JavaSecurityAccessImpl上的java.security.AccessController.doPrivileged(本机方法)$ 4.run(EventQueue.java:731)。doIntersectionPrivilege(ProtectionDomain.java:74)在java.awt.EventQueue.dispatchEvent(EventQueue.java:730)在java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java :116)在java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)在Java .awt.EventDispatchThread.run(EventDispatchThread.java:82)java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)处PumpEventsForFilter(EventDispatchThread.java:116)在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.pumpEvents(EventDispatchThread.java:101)处:93)at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)处PumpEventsForFilter(EventDispatchThread.java:116)在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.pumpEvents(EventDispatchThread.java:101)处:93)at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

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

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 16:02:24 528 分享 版权
1 条回答
写回答
取消 提交回答
  • 从查询中不知道数据的结构就很难说:"SELECT * FROM lessons WHERE lesson_id = '" + name + "';"似乎您正在尝试将其lesson_id与所name学课程相匹配。

    也可能是String name = (String) tblOpenLesson.getModel().getValueAt(selectedRow, selectedColumn);没有给您您所期望的。

    另一方面,您确实需要查看“准备好的语句”。照原样,您的应用程序易于进行SQL注入。

    就个人而言,我还将重构代码,以便:

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

    成为:

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

    并且:return (String) list.get(0);变为return "";。 回答来源:Stack Overflow

    2020-03-27 16:02:50
    赞同 展开评论