[RESOLVIDO]Erro na criação da Connection Factory (Unknown initial character set index '255' received from server.)

39 respostas Resolvido
daocrudmvcjavamysql
S

Bom dia a todos. Estou uma classe DAO para um programa que cadastra contas bancárias. Já fiz o ConnectionFactory. O meu problema está acontecendo quando vou inserir algo no banco de dados. Segue ai o meu método comentado para melhor entendimento:

public class ContaDAO {

    private Connection conn;

    public ContaDAO(Connection conn) { // Construtores

        this.conn = conn;

    }

    public ContaDAO() { 

    }

    public boolean create(ContasModel contas) throws SQLException { // Passo como parâmetro a Arraylist que estão os dados das contas. (Sinto que está errado kkk)
        String sql = "insert into conta(codConta, titular, saldo, limite)"
                + "values(?,?,?,?);";
        try {
            PreparedStatement st = conn.prepareStatement(sql); // Aqui mora o problema
            st.setInt(1, contas.getConta());
            st.setString(2, contas.getNome());
            st.setDouble(3, contas.getSaldo());
            st.setDouble(4, contas.getLimite());
            st.execute();
            return true;

        } catch (SQLException ex) {

            ex.printStackTrace();

            return false;

        }

    }

Ali no início do try ele acusa um NullPointerException, e não consigo resolver de jeito nenhum. Já tentei pegar metodos de outras pessoas, está igual ao meu, mas no meu ocorre isso. O que será que pode ser isso? Sei que essa exception indica que estou tentando acessar algo que ainda não foi inicializado. Mas como resolver essa exception?

39 Respostas

S

Ops escrevi código errado no parâmetro kk corrigindo:

public boolean create(ArrayList <ContasModel> contas) throws SQLException {
        for (ContasModel obj : contas){
        String sql = "insert into conta(codConta, titular, saldo, limite)"
                + "values(?,?,?,?);";
        try {
            PreparedStatement st = conn.prepareStatement(sql);
            st.setInt(1, obj.getConta());
            st.setString(2, obj.getNome());
            st.setDouble(3, obj.getSaldo());
            st.setDouble(4, obj.getLimite());
            st.execute();
            return true;    //  ai sim segue o código
S

Como você inicializou o atributo conn?

Posta o código onde você criou o objeto da classe ContaDAO.

Por que você tem um construtor sem parâmetros?
Não faz sentido já que você tem um construtor que recebe o objeto Connection por parâmetro.

S

Já vou mostrar o motivo meu caro:

public void recebeDados(int conta, String nome, double saldo, double limite) { // Método na controladora que recebe os dados da View

        ContasModel modelo = new ContasModel();
        ContaDAO DAO = new ContaDAO(); // quando criei aqui e não mandei nada, ele falou para criar um construtor sem parâmetros.

        modelo.setConta(conta);
        modelo.setNome(nome);
        modelo.setSaldo(saldo);
        modelo.setLimite(limite);

        contas.add(modelo); // Salvando na ArrayList
        
        try {
            DAO.create(contas); // Quando chamo o DAO, ele pede pra circundar com try/catch e vem dessa forma pra mim (Não alterei nada nessa parte do código até o momento)
        } catch (SQLException ex) {
            Logger.getLogger(CadastroContaController.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

Pode ser que minha instância do DAO ai esteja errada… :thinking:

S

E pensando com meus botões, em vez de mandar pro DAO a minha ArrayList, referenciando a classe Model eh melhor, ja que ela vai ser invocada toda vez que uma nova conta for inserida… Dai não preciso dessa iteração que eu fiz…

Ficando dessa forma:

public boolean create(ContasModel contas) throws SQLException { // passando a classe modelo agora, visto que vai ser chamada toda vez que o método na controladora for invocado, não tendo necessidade do iterator que estava antes.

        String sql = "insert into conta(codConta, titular, saldo, limite)"
                + "values(?,?,?,?);";
        try {
            PreparedStatement st = conn.prepareStatement(sql);
            st.setInt(1, contas.getConta());
            st.setString(2, contas.getNome());
            st.setDouble(3, contas.getSaldo());
            st.setDouble(4, contas.getLimite());
            st.execute();
            return true;

        } catch (SQLException ex) {

            ex.printStackTrace();

            return false;
        }
    }
S

O Java não manda nada, o compílador só dá sugestões baseado nos códigos que você escreve.
Você não tinha um construtor sem parâmetros, mas escreveu um código chamando um construtor sem parâmetros.
Aí o compilador só te sugeriu criar um pois não existia.
Mas no seu contexto não faz sentido ter um construtor sem parâmetros.

Sua classe ContaDAO só funciona com um objeto do tipo Connection, que é o atributo que você chamou de conn e que é recebido pelo construtor, então não deve existir um construtor sem parâmetros.

Apaga aquele construtor sem parâmetros e trate de passar um objeto Connection para o construtor, conforme ele espera. :slight_smile:

ContaDAO dao = new ContaDAO( meuObjetoConnection );
S

No caso, o “meuObjetoConnection” seria o que, especificamente? :thinking:

S
+-----------------+
             | SERIA ISSO AQUI |
             +--------+--------+
                      |
                      |
                      V
public ContaDAO(Connection conn) { // Construtores
    this.conn = conn;
}

Está seguindo algum material para aprender?

S

Apenas coisas que vou achando na internet mesmo. Teria alguma sugestão?

Certo, mas ai la na controladora, como eu faria?

S

Onde você inicializa a conexão com o banco de dados?
Lá com certeza você criou um objeto do tipo Connection.

S

No caso vc quer dizer a ConnectionFactory?

Lá tem isso aqui:

public static Connection getConnection() {
                try {
                    Class.forName(DRIVER);

                return DriverManager.getConnection(URL, USER, PASS);

            } catch (ClassNotFoundException | SQLException ex) {
                throw new RuntimeException("Erro na conexão!", ex);
            }
        }
S

Posta o código onde você realiza a conexão com o banco de dados.

S

Editei o post acima

S

E onde você chama o método getConnection()?

S

Bingo! Eu não estou chamando em lugar nenhum :sweat_smile:
Eu chamaria este método dentro do método create? :thinking:

S

Não sei, não sei quais classes você tem, quais as responsabilidades dela nem como elas se relacionam.

S

Deixa eu ver se consigo te explicar:

  • Tenho a View, com a interação com o usuário.
  • Controller, que tem o metodo q pus ai acima que insere tanto na arraylist quanto no model.
  • Model, que salva os dados das contas inseridas.
  • ConnectionFactory, que invoca o banco de dados e também tem os métodos que fecham o mesmo
  • ContaDAO que é essa que estamos discutindo.
S

Então imagino que o Controller é quem tem vai manter a Connection em uma variável de instância e passar ela para o(s) DAO(s) que você criar.

S

Eu vi uma outra classe DAO aqui de um jeito diferente, sem instanciar algum objeto Connection, mas instanciando meu model. Começa com o usuário preenchendo os dados, e ao pressionar o botão para inserir, é chamado este método no controller:

public class CadastroContaController {

       public void recebeDados(int conta, String nome, double saldo, double limite) {

        ContasModel modelo = new ContasModel();  

        // Setando o model
        modelo.setConta(conta); 
        modelo.setNome(nome);
        modelo.setSaldo(saldo);
        modelo.setLimite(limite);

        ContaDAO dao = new ContaDAO(modelo); // Chamando a classe DAO, passando o model como argumento.
               
        dao.create(); // Chamando o método do CRUD que insere no banco de dados.
        

    }

Minha classe de criação de conexão:

public class ConnectionFactory {

        private static Connection conexao;
        private static final String DRIVER = "com.mysql.jdbc.Driver";
        private static final String URL = "jdbc:mysql://localhost:3306/banco";
        private static final String USER = "root";
        private static final String PASS = "sql123";

        public static Connection getConnection() {

            try {
                if (conexao == null) {

                    Class.forName(DRIVER);

                    conexao = DriverManager.getConnection(URL, USER, PASS);
                }
                return conexao;

            } catch (ClassNotFoundException ex) {
                JOptionPane.showMessageDialog(null, "Erro no driver jdbc!");
                ex.printStackTrace();
                return null;
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Erro na conexão com o banco de dados!");
                ex.printStackTrace();
                return null;
            }
        }
    }

E essa daqui eh a classe DAO:

public class ContaDAO {

        private ContasModel conta;
        private final String SQLINSERIR = "insert into conta values(?,?,?,?);";
        

        ContaDAO(ContasModel conta) { // recebendo o model como parâmetro.
            
            this.conta = conta;   

        }

        public boolean create() {
        
            try {
                PreparedStatement ps = Conexão.getConnection().prepareStatement(SQLINSERIR);
                ps.setInt(1, conta.getConta());
                ps.setString(2, conta.getNome());
                ps.setDouble(3, conta.getSaldo());
                ps.setDouble(4, conta.getLimite());
                ps.executeUpdate();
                return true;

            } catch (SQLException ex) {

                ex.printStackTrace();
                JOptionPane.showMessageDialog(null, "Não foi possível incluir esta conta no banco de dados.");

                return false;
            } 
        }

Porém dentro do PrepareStatement está dando NullPointerException também dessa forma…

Não to conseguindo fazer esse erro parar de acontecer. :thinking:

S

Cadê o fonte da classe Conexão?

S

Eu renomeei pra ConnectionFactory, perdão :sweat_smile:
A classe ConnectionFactory que eu postei eh a Conexão que está ai. Perdão pelo vacilo. (Joguei no Word antes de responder aqui e ai errei kk)

Na verdade é isso aqui:

PreparedStatement ps = ConnectionFactory.getConnection().prepareStatement(SQLINSERIR);

S

E o que o método ConnectionFactory.getConnection() está retornando?
Já deu uma depurada?

S

Depurei aqui e acontece que nessa parte do código aqui:

public static Connection getConnection() {
        try {
            if (conexao == null){              
            
            Class.forName(DRIVER);

            conexao = DriverManager.getConnection(URL, USER, PASS);
            
            }return conexao; 
                    
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "Erro no driver jdbc!");
            ex.printStackTrace();
            return null;
        }
        catch ( SQLException ex){
            JOptionPane.showMessageDialog(null, "Erro na conexão com o banco de dados!");
            ex.printStackTrace();
            return null;
        }
    }
}

O Driver está sendo executado, porque o primeiro catch não é executado.
Quando vai preencher a variavel conexao, mesmo depois de passar por ela e ela receber o URL, USER e o PASS, conexao continua com valor null. Daí, ele chama o segundo catch.

S

E qual é a exceção?
Posta o StackTrace.

S

Tentei por as Strings diretamente dentro do DriverManager.getConnection()mas o stackTrace agora notifica o seguinte:

java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.
	at com.mysql.jdbc.Connection.configureClientCharacterSet(Connection.java:2969)
	at com.mysql.jdbc.Connection.initializePropsFromServer(Connection.java:3215)
	at com.mysql.jdbc.Connection.createNewIO(Connection.java:1780)
	at com.mysql.jdbc.Connection.<init>(Connection.java:430)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:268)
	at java.sql.DriverManager.getConnection(DriverManager.java:664)
	at java.sql.DriverManager.getConnection(DriverManager.java:247)
	at connection.ConnectionFactory.getConnection(ConnectionFactory.java:32) // Aqui é a linha onde eu preencho a variável connection.
	at model.ContaDAO.create(ContaDAO.java:26)
	at controller.CadastroContaController.insereDados(CadastroContaController.java:26)
	at view.CadastroContaView.botaoInserirActionPerformed(CadastroContaView.java:266)
	at view.CadastroContaView.access$400(CadastroContaView.java:18)
	at view.CadastroContaView$5.actionPerformed(CadastroContaView.java:113)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicRootPaneUI$Actions.actionPerformed(BasicRootPaneUI.java:208)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
	at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:307)
	at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:250)
	at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2974)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2966)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
	at java.awt.Component.processEvent(Component.java:6310)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at model.ContaDAO.create(ContaDAO.java:26)
	at controller.CadastroContaController.insereDados(CadastroContaController.java:26)
	at view.CadastroContaView.botaoInserirActionPerformed(CadastroContaView.java:266)
	at view.CadastroContaView.access$400(CadastroContaView.java:18)
	at view.CadastroContaView$5.actionPerformed(CadastroContaView.java:113)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicRootPaneUI$Actions.actionPerformed(BasicRootPaneUI.java:208)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
	at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:307)
	at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:250)
	at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2974)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2966)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
	at java.awt.Component.processEvent(Component.java:6310)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
S

Pesquisando sobre esse erro, percebi que o motivo é que as configurações do driver do MySQL e do conjunto de caracteres do banco de dados não correspondem. Porém não consegui resolver.

R

O driver mudou na versão 8

com.mysql.cj.jdbc.Driver

DriverManager.getConnection(jdbc:mysql://localhost/test?” +
     user=minty&password=greatsqldb)
S

Mas tenho um catch para caso o driver não funcione, ele seja usado. Porem o erro não ocorre no driver pq este catch não eh chamado em nenhum momento. O catch chamado é sempre o segundo, ou seja, o driver existe, mas na conexão que falha.

Quando coloco dessa forma, ocorre o primeiro catch, dizendo que não foi encontrado o driver.

R

Vc viu q a conexão mudou também?
Vc está utilizando o MySQL 8?

DriverManager.getConnection(**jdbc:mysql:**//localhost/test?” +
user=minty&password=greatsqldb)
S

Vi sim

Uso o MySQL Workbench 8.0 CE

E sobre isso, pegando o caminho ate chegar no Driver la nas bibliotecas, meu caminho não é esse, e sim o padrão: com.mysql.jdbc.Driver. Será que estou usando um connector de outra versão? :thinking:

R

Então o Workbench é apenas uma ferramenta visual.
Antes de ver qual o driver e conexão corretos você precisa saber qual é a versão correta do mysql.

S

Hmm não sabia. Obrigado pela informação :+1:

Olhando aqui no painel de controle, versão 8.0 do MySQL Server e o MySQL Connector/ODBC 8.0 também.

R

Baixe o jar do mysql conector 8, caso não a tenha.

https://dev.mysql.com/downloads/connector/j/

na sua classe ConnectionFactory faça algumas alterações:

Class.forName(“com.mysql.cj.jdbc.Driver”).newInstance();

conexão = DriverManager.getConnection(“jdbc:mysql://localhost/test?” +
“user=minty&password=greatsqldb”)
;

Pelo que andei pesquisando o modo de conexão mudou e deve ser passado conforme no exemplo, não passando o user e passwords separado.

https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html#connector-j-examples-connection-drivermanager

S

Além do connector instalado preciso do arquivo jar? Pode ser isso que esteja faltando…

Hmm interessante :thinking:

S

Neste link eu ja fui, baixei o instalador MSI e instalei por ele mesmo e veio o MySQL 8.0 e o Connector 8.0 também.

Ele não acha este Driver, pois conforme falei o arquivo Driver na biblioteca segue: com.mysql.jdbc.Driver.

Sobre isso, ele deu mais uma exception:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client

S

E outra coisa @RobertoDM: quando vc for escrever código fonte, selecione o texto e dps aperte o botão “</>” para formatar ele como código fonte. Alem de deixar mais visível, não bate aquele desanimo de tentar entender codigo nao formatado, fechou? :wink: Dai ele fica formatado, percebe a diferença?

R

Percebo, estou digitando no celular.
Quando chegar em casa faço a conexão e te envio.
Como está escrito no erro, vc pode ter baixado o driver do MySQL, mas está utilizando o antigo.
Por isso está confusão.
O MySQL instalado é o 8.
O driver é outro.
E a conexão diferente

S

O vídeo postado não ajuda o colega a encontrar a solução para o problema postado. :frowning:

S
Solucao aceita

Consegui resolver o problema :hugs: peguei com um amigo o connector e a classe connection factory, e de fato era o connector que estava errado e mudei tbm a classe connectionFactory. Acabou que ela ficou assim:

public class ConnectionFactory {

    static Connection conexao = null;
    static Statement statement = null;
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/banco?useTimezone=true&serverTimezone=UTC&useSSL=false";
    private static final String USER = "root";
    private static final String PASS = "sql123";

        public static Connection getConnection() {
            try {
                if (conexao == null) {

                    Class.forName(DRIVER);
                    conexao = DriverManager.getConnection(URL,USER,PASS);
                    statement = conexao.createStatement();
                }
                return conexao;

            } catch (ClassNotFoundException ex) {
                JOptionPane.showMessageDialog(null, "Erro no driver jdbc!");
                ex.printStackTrace();
                return null;
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Erro na conexão com o banco de dados!");
                ex.printStackTrace();
                return null;
            }
        }


    }

Mas obrigado a todos! :+1:

S

Nem respondi esse cara, pq ele posta esse vídeo em um monte de tópicos.

Criado 3 de maio de 2019
Ultima resposta 8 de mai. de 2019
Respostas 39
Participantes 3