5
respostas

[Bug] Aula 01 Vídeo 10 - Erro ao executar o testeConexao

Preciso de ajuda para resolver um bug que está acontecendo eu meu projeto. Ao executar a classe main testeConexao, apresenta erro


Exception in thread "main" java.lang.NullPointerException
    at org.example.kotlin_jogos.connection.JogosDAO.getJogos(JogosDAO.kt:27)
    at TesteConexaoKt.main(TesteConexao.kt:11)
    at TesteConexaoKt.main(TesteConexao.kt)

Tentei sozinh encontrar a solução, mas não conseguir identificar.

Meu proejeto nop GIT: https://github.com/judsonmarques/gamerkotlin/tree/master

5 respostas

Olá Judson! Tudo bem?

Pelo erro java.lang.NullPointerException que você mencionou, parece que algo está sendo chamado em um objeto nulo na linha 27 da sua classe JogosDAO. Isso geralmente acontece quando tentamos acessar métodos ou propriedades de um objeto que não foi inicializado ou quando a URL do banco de dados e as credenciais estão incorretas.

E ao testar o seu código não recebi nenhum erro ao executar o main do arquivo TesteConexao, que é o mesmo código testado em aula. O que me leva a concluir que o seu erro está sendo causando por alguma inconsistência na sua string de conexão com o banco de dados.

Por isso, certifique-se que as informações presentes nela estejam corretas.

DriverManager.getConnection("jdbc:mysql://localhost:3306/nomeDoBanco", "root", "senhaAqui")

Espero ter ajudado e bons estudos!

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

Oi Armando, obrigado pelo retorno.

Então, eu já tinha verificado a conexão com o banco e acredito que não seja isso, por exemplo, em todas as tentativas, mesmo dando o erro o jogo é adicionado ao banco.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

No main textConexao, comentei o listaJogos e não deu erro o jogo foi adicionado a tabela. No entanto quando tirei o comentario o mesmo erro apareceu, tem algum detalhe de erro nessa classe jogosDAO que não estou identificando.

Bom dia, Judson! Peço desculpa pela demora em retornar.

Analisei e testei o seu código, mais especificamente o do arquivo "TesteConexao" que você estava com problemas, mas não encontrei nenhuma inconsistência, apenas tive que alterar algumas informações do banco de dados para poder realizar a conexão.

Além disso, no seu arquivo "JogosDao" não encontrei nenhum problema ou algo que você deixou passar, então, caso ainda esteja com problemas, peço que compartilhe um print do erro que você está recebendo.

Bons estudos!

Bom dia, testei hoje e continua a mesma coisa.

Erro ao executar a classe TesteConexaoOlhei os construtores e não apresenta erro.

Classe jogosDao

package org.example.kotlin_jogos.connection

import org.example.kotlin_jogos.connection.ConexaoBD.obterConexao
import org.example.kotlin_jogos.modelos.Jogo

class JogosDAO {



    fun getJogos(): List<Jogo> {

        val listaJogos = mutableListOf<Jogo>()
        val connection = obterConexao()

        if (connection != null) {
            try {
                val statement = connection.createStatement()
                val resultado = statement.executeQuery("SELECT * FROM JOGOS")

                while (resultado.next()) {
                    val id = resultado.getInt("id")
                    val titulo = resultado.getString("titulo")
                    val capa = resultado.getString("capa")
                    val descricao = resultado.getString("descricao")
                    val preco = resultado.getDouble("preco")


                    val jogo = Jogo(titulo, capa, preco, descricao, id)
                    listaJogos.add(jogo)

                }
                statement.close()
            } finally {
                connection.close()
            }
        }
        return listaJogos
    }

    fun adicionarJogo(jogo: Jogo) {
        val connection = obterConexao()
        val insert = "INSERT INTO JOGOS (TITULO, CAPA, PRECO, DESCRICAO) VALUES (?, ?, ?, ?)"

        if (connection != null) {
            try {
                val statement = connection.prepareStatement(insert)
                statement.setString(1, jogo.titulo)
                statement.setString(2, jogo.capa)
                statement.setDouble(3, jogo.preco)
                statement.setString(4, jogo.descricao)

                statement.executeUpdate()
                statement.close()

            } finally {
                connection.close()
            }
        }
    }

}

Classe Jogo

package org.example.kotlin_jogos.modelos

import com.google.gson.annotations.Expose
import java.math.BigDecimal

data class Jogo(
                @Expose val titulo: String,
                @Expose val capa: String) {

    private var id: Int = 0
    var descricao:String? = null
    var preco =  0.0
        constructor(titulo: String, capa: String, preco: Double, descricao: String, id: Int):
            this(titulo, capa) {
        this.preco = preco
        this.descricao = descricao
        this.id = id

    }
    override fun toString(): String {
        return "Meu Jogo: \n" +
                "titulo: $titulo, \n" +
                "capa: $capa, \n" +
                "Preço R$:$preco, \n" +
                "descricao: $descricao, \n" +
                "id: $id"

    }


}

Olá Judson!

Os códigos que você compartilhou estão um pouco diferentes dos que estão presentes no seu repositório no GitHub, que era o que eu estava usando para testes anteriormente.

Então, substituindo os códigos que eu já tinha com os que você compartilhou, obtive um erro um pouco diferente do que você compartilhou, e ele acontece porque no construtor da classe Jogos você faz a requisição da passagem do campo id, mas em nenhum momento você faz essa passagem de informação.

Ela pode ser facilmente resolvida com a adição de um valor default para o id. Segue um exemplo:

    constructor(titulo: String, capa: String, preco: Double, descricao: String, id: Int = 0):
            this(titulo, capa) {
        this.preco = preco
        this.descricao = descricao
        this.id = id

    }

O valor 0 não vai influenciar em nada no valor do id no banco de dados, já que o incremento desse valor é feito automaticamente pelo seu banco de dados.

Imagino que isso resolva o seu problema, mas pode não ser a solução completa caso você tenha feito outras alterações que não constam no seu repositório.

Bons estudos!