Banco de Dados MYSQL não conecta

Boa noite amigos tudo bem. Sou novo aqui na comunidade, preciso muito da ajuda de vocês se possível. Estou fazendo um curso introdutório de JAVA e quando finalizar irei optar pela a TRILHA JAVA. Infelizmente ao executar o projeto Main clicando em Run File ocorre o seguinte erro:

Task :app:run FAILED
Exception in thread “main” java.lang.RuntimeException: Erro na conex�o com o banco de dados
at util.ConnectionFactory.getConnection(ConnectionFactory.java:35)
at controller.ProjectController.save(ProjectController.java:46)
at TodoApp.Main.main(Main.java:25)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

A Professora explicou que preciso rever todas as classes novamente para tentar encontrar o erro. Veja a fala dela:

Os erros estão ocorrendo em diferentes classes, não somente na main, por esse motivo sugeri rever algumas aulas desse módulo.

Vou deixar com vocês algumas soluções que podem me ajudar. São elas:

1, Enviar pra vocês o material do Professor para tentarem me ajudar no código que estou errando. Obs. Desculpe a minha ignorância, mas me ajudem a como enviar através do GITHUB, pois ainda estou aprendendo a usar.

  1. Tentar me ajudar apenas vendo o módulo do código que fiz que está no endereço abaixo do github:
    GitHub - ElcioGH/Todo-App

Aguardo retorno,

Muito obrigado

Bobagem, o StackTrace mostra claramente que o erro ocorre no método controller.ProjectController.save(ProjectController.java:46)

A exceção que você tem, com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure, indica que o seu banco de dados não está no ar.
Você precisa inicializar ele pra poder conectar.

Hoje é um bom dia pra aprender a ler mensagens de erro :slight_smile:

Esse monte de linhas começando com “at …” formam o stacktrace, que nada mais é do que a pilha de chamadas do seu programa. Basicamente, se eu chamo um método da classe A, que por sua vez chama outro método da classe B, que por sua vez chama outro método da classe C e dá um erro nessa classe, o stacktrace mostrará esta pilha (“deu erro em C, que foi chamado por B, que foi chamado por A”).

No seu caso temos:

Exception in thread “main” java.lang.RuntimeException: Erro na conex�o com o banco de dados
at util.ConnectionFactory.getConnection(ConnectionFactory.java:35)
at controller.ProjectController.save(ProjectController.java:46)
at TodoApp.Main.main(Main.java:25)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

A primeira linha é o erro propriamente dito: ocorreu algum erro ao se conectar com o banco.

No caso, o erro ocorreu na classe util.ConnectionFactory, método getConnection, na linha 35. Este método foi chamado na classe controller.ProjectController, método save (linha 46). E este, por sua vez, foi chamado na classe TodoApp.Main, no método main (linha 25).

Por fim, o “Caused by” é a causa raiz que gerou o erro. Se não sabe o que ele significa, uma dica básica é pesquisar sobre a mensagem exata. Por exemplo, indo no Google e pesquisando por “com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure, o primeiro resultado que aparece é esse, que já dá várias dicas sobre o que pode ter causado o problema.

Basicamente, se foi um erro de comunicação (CommunicationsException, “Communications link failure”), então ocorreu algum problema ao se conectar com o banco de dados (faz sentido, o erro ocorreu em getConnnection, ou seja, na hora de obter uma conexão). E podem ser vários motivos: o banco de dados não está rodando, alguma configuração (IP, porta, usuário, senha) está errada, etc. Tentou se conectar no banco usando alguma ferramenta externa? Conferiu as configurações? Vá fazendo testes isolados e por eliminação vc vai chegando na causa.

Uma vez que vc aprende a ler as mensagens de erro e isolar os pontos em que ela ocorre, elimina a necessidade de “rever todas as classes novamente”. Vc pesquisa sobre o erro, vê no stacktrace as classes e linhas onde ocorre e foca somente naqueles pontos específicos. Aprenda a debugar, é uma das atividades que toma mais tempo na nossa área, e também uma das mais essenciais.


Outro detalhe importante: apesar de ter várias classes no stacktrace, não quer dizer necessariamente que todas estão dando problema. Isso é apenas a pilha de chamadas, o caminho que o código fez pra chegar no ponto em que deu erro. Claro que às vezes o problema pode estar na classe que iniciou o processo (passou um dado errado pra segunda, que por isso gerou um resultado incorreto que dá erro na terceira), mas tem vezes em que o problema está somente na última (como é o caso aqui). O stacktrace serve pra vc saber exatamente por onde o código passou, e te ajudar a debugar. Mas nem sempre vc precisa revisitar todas as classes.

Bom dia Storoski, muito obrigado pelo retorno. Creio que já fiz esse teste e continua apresentando o mesmo erro, mas vou tentar fazer novamente e qualquer coisa posto aqui. Muito obrigado

Bom dia Hugo,

Vou analisar com carinho tudo que escreveu aqui e qualquer coisa volto a entrar em contato. Muito obrigado

Boa noite amigo tudo bem. Desculpe estar respondendo agora, estava muito ocupado com outras atividades. Pesquisei alguma coisa do que falou, a porta 3306 da minha máquina está conectando normalmente, porém, o erro ainda continua, Veja o erro abaixo:

Task :app:run FAILED
Exception in thread “main” java.lang.NullPointerException: Cannot invoke “java.util.Date.getTime()” because the return value of “model.Project.getCreatedAt()” is null
at controller.ProjectController.save(ProjectController.java:53)
at TodoApp.Main.main(Main.java:24)

Pesquisei no chatgpt e o mesmo me listou o seguinte código abaixo:

public class ProjectController {
public void save(Project project) {
// Verifique se getCreatedAt() retorna um valor nulo
if (project.getCreatedAt() != null) {
// Se não for nulo, chame getTime()
long createdAtTime = project.getCreatedAt().getTime();
// Resto do seu código aqui…
System.out.println("Data de criação do projeto: " + createdAtTime);
} else {
// Lide com a situação em que getCreatedAt() retorna nulo
System.out.println(“A data de criação do projeto é nula. Tratando esse caso…”);
// Você pode definir uma data padrão, criar uma nova data, ou lidar de outra forma
// Aqui, por exemplo, estou apenas imprimindo uma mensagem
}
// O restante do seu código continua aqui, mesmo que a data de criação seja nula
}
}

Como faço para acrescentar esses códigos acima no meu código que está no meu projeto. Esse código abaixo é do meu projeto sem essas linhas de código do chatgpt. Como acrescento os código do chatgpt no meu projeto:

package controller;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.Project;
import util.ConnectionFactory;

/**
*

  • @author lohan
    */
    public class ProjectController {

    /**
    *

    • @param project
      */

    public void save (Project project){

     String sql = "INSERT INTO projects (name, "
             +"description,"
             +"createdAt"
             +"updatedAt) VALUES(?, ?, ?, ?)";
     
     Connection connection = null;
     PreparedStatement statement = null;
     
     
     
     
     try {
         
         connection = ConnectionFactory.getConnection();
         statement = connection.prepareStatement(sql);
         statement.setString(1, project.getName());
         statement.setString(2, project.getDescription());      
         statement.setDate(3, new Date(project.getCreatedAt().getTime()));
         statement.setDate(4, new Date(project.getUpdatedAt().getTime()));
         boolean execute = statement.execute();
                  
         
     } catch (SQLException ex) {
         throw new RuntimeException("Erro ao salvar a tarefa "
               + ex.getMessage(),ex);
     } finally{
         ConnectionFactory.closeConnection(connection, statement);
     }
    

    }

    public void update(Project project) throws SQLException{
    String sql = "UPDATE project SET "
    +"name = ?, "
    +"description = ?, "
    +"createdAt = ?, "
    +"updatedAt = ?, "
    +“WHERE id = ?”;

     Connection connection = null;
     PreparedStatement statement = null;
     
     try {
          //Cria uma conexão com o banco de dados
         connection = ConnectionFactory.getConnection();
         
         //Cria um PreparedStatement, classe usada para executar a query
         statement = connection.prepareStatement(sql);
         
         //Setando os valores do statement
         statement.setString(1, project.getName());
         statement.setString(2, project.getDescription());
         statement.setDate(3, new Date(project.getCreatedAt().getTime()));
         statement.setDate(4, new Date(project.getUpdatedAt().getTime()));
         statement.setInt(5, project.getId());
         
         //Executndo a query
         statement.execute();
     } catch (SQLException e) {
         throw new SQLException("Erro ao atualizar a tarefa");
     } finally {
         ConnectionFactory.closeConnection(connection, statement);
     }
    

    }

    public void removeByid(int IdProject) throws SQLException{
    String sql = “DELETE FROM tasks WHERE id = ?”;

     Connection connection = null;
     PreparedStatement statement = null;
     
     
     try {
         
         //Criação da conexão com o banco de dados
         connection = ConnectionFactory.getConnection();
         
         //Preparando a query
         statement = connection.prepareStatement(sql);
         
         //Setndos os valores
         statement.setInt(1, IdProject);
         
         //Executndo a query
         statement.execute();
     } catch (SQLException e) {
         throw new SQLException("Erro ao deletar uma tarefa");
     } finally {
         ConnectionFactory.closeConnection(connection, statement);
     }
    

}

@SuppressWarnings("empty-statement")

//Lista de tarefas que será devolvida quando a chamada do método acontecer
public List<Project> getAll() {
    
    String sql = "SELECT * FROM projects";
   
    List<Project> projects = new ArrayList<>();
    
    Connection connection = null;
    PreparedStatement statement = null;
    
    try {
        //Criação da conexão
        connection = ConnectionFactory.getConnection();
        statement = connection.prepareStatement(sql);
        
        //Valor retornando pela a exeução da query
        ResultSet resultSet = statement.executeQuery();
        
        //Enquanto houverem valores a serem percorridos no meu resultSet
        while(resultSet.next()){
        
            Project project = new Project();
            project.setId(resultSet.getInt("id"));
            project.setName(resultSet.getString("name"));
            project.setDescription(resultSet.getString("description"));
            project.setCreatedAt(resultSet.getDate("createdAt"));
            project.setUpdatedAt(resultSet.getDate("updated"));
            
            projects.add(project);
        }
        
    } catch (SQLException e) {
        try {
            throw new SQLException("Erro ao inserir a tarefa");
        } catch (SQLException ex) {
            Logger.getLogger(ProjectController.class.getName()).log(Level.SEVERE, null, ex);
        }
    } finally {
        ResultSet resultSet = null;
        ConnectionFactory.closeConnection(connection, statement, resultSet);
    }
    
    return null;
   

}

public List<Project> getALL() {
    throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}

Aguardo retorno,

Muito obrigado

Nessas linhas você tem chamadas encadeadas de método, então se um método “do meio” retornar null você terá NullPointerException.

Aprenda a usar variáveis locais e a testar se o valor é diferente de null.

Boa noite meu amigo tudo bem. Mas como eu faço para fazer esse teste e o projeto rodar normalmente. Obrigado

Ué, joga o resultado do método para uma variável local e daí testa:

Date createdAt = project.getCreatedAt();
if (createdAt != null) {
    statement.setDate(3, new Date(createdAt.getTime()));
}