Java JDBC Sql错误索引超出范围

Java JDBC Sql错误索引超出范围,java,mysql,database,jdbc,indexing,Java,Mysql,Database,Jdbc,Indexing,在您询问为什么有一个对象使用setter和getter在数据库中添加和检索数据之前,我们的讲师告诉我们,我们应该从根开始学习JDBC,现在我想知道为什么我的查询不起作用?它给了我一个超出范围的索引,特别是在第63行和第62行 import java.awt.*; import java.sql.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.Acti

在您询问为什么有一个对象使用setter和getter在数据库中添加和检索数据之前,我们的讲师告诉我们,我们应该从根开始学习JDBC,现在我想知道为什么我的查询不起作用?它给了我一个超出范围的索引,特别是在第63行和第62行

import java.awt.*;
    import java.sql.*;
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

public class Login extends JFrame {

    private JLabel label1, label2;
    private JButton submit;
    private JTextField textfield1;
    private JPasswordField passfield;
    private JPanel panel;

    public Login() {

        super("Log in");
        setSize(300, 100);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        label1 = new JLabel("User ID:");
        textfield1 = new JTextField(15);
        label2 = new JLabel("Password:");
        passfield = new JPasswordField(15);
        submit = new JButton("Submit");
        panel = new JPanel(new GridLayout(3, 1));

        panel.add(label1);
        panel.add(textfield1);
        panel.add(label2);
        panel.add(passfield);
        panel.add(submit);
        add(panel, BorderLayout.CENTER);

        ButtonHandler handler = new ButtonHandler();
        submit.addActionListener(handler);
    }// end login constructor

    private class ButtonHandler implements ActionListener {

        public void actionPerformed(ActionEvent event) {

            String user = textfield1.getText();
            char[] passChars = passfield.getPassword();
            Connection conn = Jdbc.dbConn();
            PreparedStatement ps = null;
            ResultSet rs = null;
            String pass = new String(passChars);

            User finance  = new Finance();

            finance.setEmpID(user);
            finance.setPassword(pass);

            if (passChars != null) {
                String sql = "SELECT finance_ID, finance_pass FROM  finance_accounts WHERE finance_ID ='"+finance.getEmpID()+"' " +
                        "AND finance_pass = '"+finance.getPassword()+"'";

                try {
                    ps = conn.prepareStatement(sql);
                    ps.setString(1,user);
                    ps.setString(2, pass);
                    rs = ps.executeQuery();
                    if (rs.next()) {
                        JOptionPane.showMessageDialog(null,"Welcome! "+user);
                        dispose();
                    } else {
                        JOptionPane.showMessageDialog(null, "User ID or password is incorrect");
                    }
                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                    try {
                        rs.close();
                        ps.close();
                        conn.close();
                    } catch (Exception ee) {
                            ee.printStackTrace();
                    }
                }
            }// end actionPerformed
        }// End ButtonHandler
    }// End of class
}
这是我的错误

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3729)
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3713)
    at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4553)
    at Login$ButtonHandler.actionPerformed(Login.java:63)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6288)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6053)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4651)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:616)
    at java.awt.EventQueue$2.run(EventQueue.java:614)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.lang.NullPointerException
    at Login$ButtonHandler.actionPerformed(Login.java:76)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6288)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6053)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4651)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:616)
    at java.awt.EventQueue$2.run(EventQueue.java:614)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

无效的参数语法。使用?(问号)作为占位符

String sql = "SELECT finance_ID, finance_pass FROM  finance_accounts 
            WHERE finance_ID=? and finance_pass=?";

 try {
     ps = conn.prepareStatement(sql);
     ps.setString(1,finance.getEmpID());
     ps.setString(2,finance.getPassword());
     rs = ps.executeQuery();
     ...

无效的参数语法。使用?(问号)作为占位符

String sql = "SELECT finance_ID, finance_pass FROM  finance_accounts 
            WHERE finance_ID=? and finance_pass=?";

 try {
     ps = conn.prepareStatement(sql);
     ps.setString(1,finance.getEmpID());
     ps.setString(2,finance.getPassword());
     rs = ps.executeQuery();
     ...

您使用preparedStatement的方式是错误的

select SQL字符串应如下所示:

String sql = "SELECT finance_ID, finance_pass FROM  finance_accounts WHERE finance_ID = ? AND finance_pass = ?";

设置准备好的语句时,应使用
ps.setInt(1,用户)
设置您的使用id。

您使用preparedStatement的方式是错误的

select SQL字符串应如下所示:

String sql = "SELECT finance_ID, finance_pass FROM  finance_accounts WHERE finance_ID = ? AND finance_pass = ?";

设置准备好的语句时,应使用
ps.setInt(1,用户)
设置您的使用id。

这是否意味着我不使用getter?您可以使用它,但不是必需的。这是否意味着我不使用getter?您可以使用它,但不是必需的。这是否意味着我不使用getter??或者我真的应该用一个?我不能连接变量吗???@KyelJmD-这取决于你。你已经用过了。看看编辑过的帖子。这是否意味着我不会使用我的getters??或者我真的应该用一个?我不能连接变量吗???@KyelJmD-这取决于你。你已经用过了。看看编辑后的帖子。