[RESOLVIDO] Erro Parameter index out of range (2 number of parameter which is 1)

Olá, a todos!

Estou encontrando tal erro (Erro Parameter index out of ranger (2 number of parameter which is 1)) e depois de sofrer por um tempo tive que pedir ajuda ao pessoa do guj.

meu problema é o seguinte:

Enquanto estudando tentei criar um metodo que faz saque em uma conta, mas antes verifica se o saldo é maior que o valor do saque. ficou assim =>

public boolean sacarContaCorrente(int numConta, double valor) throws SQLException {
String sql = “select * from contacorrente where numConta = ?”;
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, numConta);
stmt.setDouble(2, valor);

    ResultSet rs = stmt.executeQuery();
    double saldo = 0;

   if (rs.next()){
       saldo = rs.getDouble("saldo");
       if(saldo > valor){
        saldo -= valor;
        String sql2 = "update contacorrente set saldo=? where numConta=?";

        PreparedStatement stmt2 = conn.prepareStatement(sql2);
        stmt2.setDouble(1, saldo);
        stmt2.setInt(2, numConta);
        stmt2.executeUpdate();
        return true;            
    }
   
   }
    rs.close();
    stmt.close();
    conn.close();
    return false;

}

================ então é que esse erro aparece!!!
eu não sei se é porque fiz mal esse metodo ou qualquer outra coisa.

e se alguém poder dá uma ideia descente de como fazer esse metodo agredeço.

===== se alguém poder dar uma força aí agradeço e já vou me desculpando pelo incomodo.

Consegui dee altuma forma!

A consulta que você realiza no início do método era o problema, onde você define dois parâmetros para a query SQL sendo que a mesma só espera um!

Veja que aqui o único parâmetro esperado é o número da conta.

E aqui você passa os 2 parâmetros para a query SQL onde deveria passar somente o primeiro.

entendo. mas depois depois tentei tirar e não deu certo!

talvez tivesse fazendo mais algo errado.

consegui fazer depois fazendo um metodo com retorno double só para pegar o saldo atual e depois usei um if para verificar se era maior se que o valor de saque. ficou assim

public double pegaSaldo(int conta) throws SQLException {
String sql = “select * from contacorrente where numConta = ?”;
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, conta);

    ResultSet rs = stmt.executeQuery();
    double saldo = 0;
    if (rs.next()) {
        saldo = rs.getDouble("saldo");
    }
    return saldo;
}

e o sacar ficou asssim

public void sacarContaCorrente(int numConta, double valor) throws SQLException {
double saldo = 0;

    String sql = "select * from contacorrente where numConta = ?";
    PreparedStatement stmt = conn.prepareStatement(sql);
    
    stmt.setInt(1, numConta);
    
    ResultSet rs = stmt.executeQuery();
    
    if (rs.next()) {
        saldo = rs.getDouble("saldo");

        saldo -= valor;
        String sql2 = "update contacorrente set saldo=? where numConta=?";

        PreparedStatement stmt2 = conn.prepareStatement(sql2);
        stmt2.setDouble(1, saldo);
        stmt2.setInt(2, numConta);
        stmt2.executeUpdate();
    }

    rs.close();
    stmt.close();
    conn.close();

o main ficou assim …

================

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
try {
int conta = Integer.parseInt(txtConta.getText());
double valor = Double.parseDouble(txtValor.getText());

    ContaDAO cdao = new ContaDAO();
    
        if(cdao.pegaSaldo(conta) >= valor){
          cdao.sacarContaCorrente(conta, valor);
            JOptionPane.showMessageDialog(this, "Sucesso");
        }else{
            JOptionPane.showMessageDialog(this, "Saldo Insuficiente");
        }
            
    } catch (SQLException ex) {
        Logger.getLogger(Sacar.class.getName()).log(Level.SEVERE, null, ex);
    }

}   

====================== não sei se é a melhor forma de fazer, mas funcionou. Ainda assim agradeço pelo comentário!!!