Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] Erro na hora de realizar Depósito

Boa tarde amigos,

Estou tomando um erro na hora de realizar um DEPÓSITO, abaixo está o trace.

Eu achei que tivesse codificado algo errado eu baixei o código fonte disponibilizado no final do módulo e continua dando erro.

BYTEBANK - ESCOLHA UMA OPÇÃO:
1 - Listar contas abertas
2 - Abertura de conta
3 - Encerramento de conta
4 - Consultar saldo de uma conta
5 - Realizar saque em uma conta
6 - Realizar depósito em uma conta
7 - Realizar transferência
8 - Sair

6
Digite o número da conta:
2233
Digite o valor do depósito:
500
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
    at br.com.alura.bytebank.domain.conta.ContaDAO.listarPorNumero(ContaDAO.java:106)
    at br.com.alura.bytebank.domain.conta.ContaService.buscarContaPorNumero(ContaService.java:83)
    at br.com.alura.bytebank.domain.conta.ContaService.realizarDeposito(ContaService.java:56)
    at br.com.alura.bytebank.BytebankApplication.realizarDeposito(BytebankApplication.java:137)
    at br.com.alura.bytebank.BytebankApplication.main(BytebankApplication.java:35)
Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64)
    at com.mysql.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1345)
    at com.mysql.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1358)
    at com.mysql.cj.jdbc.ClientPreparedStatement.setInt(ClientPreparedStatement.java:1536)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.setInt(HikariProxyPreparedStatement.java)
    at br.com.alura.bytebank.domain.conta.ContaDAO.listarPorNumero(ContaDAO.java:86)
    ... 4 more
Disconnected from the target VM, address: '127.0.0.1:56965', transport: 'socket'

Process finished with exit code 1

Debugando vi que esta dando erro no ps.setInt(1, numero);

public Conta listarPorNumero(Integer numero) {
        String sql = "SELECT * FROM conta WHERE numero = " + numero + " and esta_ativa = true";

        PreparedStatement ps;
        ResultSet resultSet;
        Conta conta = null;
        try {
            ps = conn.prepareStatement(sql);
            ps.setInt(1, numero);
            resultSet = ps.executeQuery();

            while (resultSet.next()) {
                Integer numeroRecuperado = resultSet.getInt(1);
                BigDecimal saldo = resultSet.getBigDecimal(2);
                String nome = resultSet.getString(3);
                String cpf = resultSet.getString(4);
                String email = resultSet.getString(5);

                DadosCadastroCliente dadosCadastroCliente =
                        new DadosCadastroCliente(nome, cpf, email);
                Cliente cliente = new Cliente(dadosCadastroCliente);

                conta = new Conta(numeroRecuperado, saldo, cliente);
            }
            resultSet.close();
            ps.close();
            conn.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return conta;
    }

Ai vc fala, - "Ah! mas vc passou um int onde é um boolean..."

ai da esse erro

BYTEBANK - ESCOLHA UMA OPÇÃO:
1 - Listar contas abertas
2 - Abertura de conta
3 - Encerramento de conta
4 - Consultar saldo de uma conta
5 - Realizar saque em uma conta
6 - Realizar depósito em uma conta
7 - Realizar transferência
8 - Sair

6
Digite o número da conta:
2233
Digite o valor do depósito:
500.0
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextBigDecimal(Scanner.java:2740)
    at br.com.alura.bytebank.BytebankApplication.realizarDeposito(BytebankApplication.java:135)
    at br.com.alura.bytebank.BytebankApplication.main(BytebankApplication.java:35)
Disconnected from the target VM, address: '127.0.0.1:57010', transport: 'socket'
1 resposta
solução!

Descobri o erro!!!

na String SQL estou passando o parâmetro concatenando o número assim

String sql = "SELECT * FROM conta WHERE numero = " + numero + " and esta_ativa = true";

ai alterei e passei como nos outros sqls, dessa forma

String sql = "SELECT * FROM conta WHERE numero = ? and esta_ativa = true";

funcionou, porque o preparedStatement que esta passando o paramentro, se eu fosse deixar concatenado como estava eu teria que tirar a parametrização feita

ps.setInt(1, numero);

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software