2
respostas

[Dúvida] NullPointerException: Cannot invoke

Oi amigos quando eu chamo o método realizar depósito, ocorre esse erro:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "numero" is null
    at br.com.alura.bytebank.domain.conta.ContaDAO.alterar(ContaDAO.java:115)
    at br.com.alura.bytebank.domain.conta.ContaService.realizarDeposito(ContaService.java:62)
    at br.com.alura.bytebank.BytebankApplication.realizarDeposito(BytebankApplication.java:134)
    at br.com.alura.bytebank.BytebankApplication.main(BytebankApplication.java:36)

Process finished with exit code 1

mas eu não estrou entendendo onde o numero fica "null", os outro métodos que eu fiz até agora funcionaram normal, e se eu digito o numero da conta errado ele funciona também!!

// Esse é o metodo para depositar
    public void realizarDeposito(Integer numeroDaConta, BigDecimal valor) {

        var conta = buscarContaPorNumero(numeroDaConta);
        if (valor.compareTo(BigDecimal.ZERO) <= 0) {
            throw new RegraDeNegocioException("Valor do deposito deve ser superior a zero!");
        }

        Connection conn = connection.recuperarConexao();
        new ContaDAO(conn).alterar(conta.getNumero(), valor);
    }
    
    //Esse é o método alterar
        public void alterar(Integer numero, BigDecimal valor) {
        PreparedStatement ps;
        String sql = "UPDATE conta SET saldo = ? WHERE numero = ?";

        try {
            ps = conn.prepareStatement(sql);

            ps.setBigDecimal(1, valor);
            ps.setInt(2, numero);

            ps.execute();
            ps.close();
            conn.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

Aqui está a tabela que ue fiz no WorkBench

2 respostas

Olá Vinicius! Como vai?

Pelo erro apresentado, parece que o problema está na variável "numero" que está nula. Isso pode estar acontecendo porque o método "buscarContaPorNumero" não está encontrando a conta desejada e retornando null.

Uma possível solução para esse problema é verificar se a conta está sendo encontrada corretamente no método "buscarContaPorNumero". Você pode adicionar um log ou imprimir no console o valor da conta retornada para verificar se está correto.

Além disso, verifique se o número da conta que você está passando como parâmetro para o método "realizarDeposito" está correto. Pode ser que você esteja passando um número de conta que não existe no banco de dados.

Espero que essas sugestões possam te ajudar. Caso mesmo com esses pontos o seu problema persistir, peço que compartilhe todo o seu projeto via GitHub ou Drive do Google.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Então no metodo listarPorNumero o numero fica null

eu usei o mesmo parametro de conta sempre, e quando eu isolei esse metodo funcionou o deposito.

public Conta listarPorNumero(Integer numero) {
        String sql = "SELECT * FROM conta WHERE numero = ?";

        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);
        }
        System.out.println("conta listar por numero " + conta);
        return conta;
    }
public void realizarDeposito(Integer numeroDaConta, BigDecimal valor) {
        var conta = numeroDaConta;
        if (valor.compareTo(BigDecimal.ZERO) <= 0) {
            throw new RegraDeNegocioException("Valor do deposito deve ser superior a zero!");
        }

        Connection conn = connection.recuperarConexao();
        new ContaDAO(conn).alterar(conta, valor);
    }

Mas mesmo assim não enxergo onde está errado!