Pessoal está dando o seguinte erro no meu aplicativo java. Eu executo o aplicativo, clico no botão que chama uma classe, essa classe consulta tem um método que consulta o banco e retorna o resultado dessa consulta.
Botão:
privatevoidjButton5ActionPerformed(java.awt.event.ActionEventevt){Stringagente="",ip="";try{Scannerscanner=newScanner(newFile("C:/Users/YPY/Documents/agente.txt"));while(scanner.hasNext()){agente=scanner.nextLine();}scanner.close();}catch(IOExceptione){e.printStackTrace();}try{Scannerscanner=newScanner(newFile("C:/Users/YPY/Documents/ip.txt"));while(scanner.hasNext()){ip=scanner.nextLine();}scanner.close();}catch(IOExceptione){e.printStackTrace();}ConectaBdconect=newConectaBd();ResultSetresultado=conect.conecta(agente,ip);try{if(resultado.next()){Stringid=resultado.getString("id");Stringcliente=resultado.getString("cliente");Stringdestino=resultado.getString("destino");if(destino.length()==12){destino=destino.substring(2);}jTextField4.setText(id);jTextField6.setText(destino);jTextField5.setText(cliente);}else{jTextField4.setText("");JOptionPane.showMessageDialog(null,"NUMERO NÃO ENCONTRADO!","",JOptionPane.WARNING_MESSAGE);}}catch(SQLExceptionex){Logger.getLogger(Jan1C2.class.getName()).log(Level.SEVERE,null,ex);}}
Classe que consulta o banco:
publicclassConectaBd{publicstaticResultSetconecta(Stringagente,Stringip){Stringdriver="com.mysql.jdbc.Driver";//Classe do driver JDBCStringbanco="trix";//Nome do Banco criadoStringusuario="pred";//Usuário do bancoStringsenha="1212";//Senha de conexãoStringstr_conn="jdbc:mysql://"+ip+":3306/"+banco;//URL de conexãotry{Class.forName(driver);Connectionconn=DriverManager.getConnection(str_conn,usuario,senha);Statementstmt=conn.createStatement();Stringsql="SELECT destino, cliente FROM active_calls where agente = '"+agente+"'";ResultSetrs=stmt.executeQuery(sql);conn.close();return(rs);}catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");// ex.printStackTrace();returnnull;}catch(SQLExceptionex){System.out.println("Problema com o SQL");// ex.printStackTrace();returnnull;}}}
Não sei qual linha isso representa no que tu postou, mas esse erro é basicamente isso:
String s = null;
s.trim();
Realize um debug em seu código e veja essa linha, pode haver algo do tipo.
Abraços.
C
champs
Pedro, você adicionou o driver jdbc do mysql no seu projeto? Caso não, é só clicar com o direito no projeto, properties, java build path, libraries, ai clica em add external jar e seleciona o driver, ou se preferir, copia o driver pra dentro do seu projeto, com ctrl+c e ctrl+v, ai vai na mesma opção, mas ao invés de adicionar como external jar, adiciona como jar normal. Vê se dá certo, ai posta ia depois o resultado.
Abs.
nel
champs:
Pedro, você adicionou o driver jdbc do mysql no seu projeto? Caso não, é só clicar com o direito no projeto, properties, java build path, libraries, ai clica em add external jar e seleciona o driver, ou se preferir, copia o driver pra dentro do seu projeto, com ctrl+c e ctrl+v, ai vai na mesma opção, mas ao invés de adicionar como external jar, adiciona como jar normal. Vê se dá certo, ai posta ia depois o resultado.
Abs.
Podes explicar como a falta do driver JDBC para esse caso pode ocorrer em um NullPointerException ?
Se não houvesse o Driver e o problema fosse este, daria uma outra exceção, não acha?
lucasportela
nel,
catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");// ex.printStackTrace(); returnnull;}
Veja que na saída ele imprimiu que não foi possível carregar o driver, sendo assim, faz todo sentido o que o champs falou.
E o NullPointer ocorre na linha
if(resultado.next()){
Porque ele retornou null e tentou buscar o proxímo.
P
Pedro_Ribeiro
champs:
Pedro, você adicionou o driver jdbc do mysql no seu projeto? Caso não, é só clicar com o direito no projeto, properties, java build path, libraries, ai clica em add external jar e seleciona o driver, ou se preferir, copia o driver pra dentro do seu projeto, com ctrl+c e ctrl+v, ai vai na mesma opção, mas ao invés de adicionar como external jar, adiciona como jar normal. Vê se dá certo, ai posta ia depois o resultado.
abs.
Realmente eu tinha esquecido de adicionar o jar do mysql connector, adicionei mas continua não funcionando, cai em outra exceção.
Realize um debug em seu código e veja essa linha, pode haver algo do tipo.
Abraços.
É nesse abaixo.
privatevoidjButton5ActionPerformed(java.awt.event.ActionEventevt){Stringagente="",ip="";try{Scannerscanner=newScanner(newFile("C:/Users/YPY/Documents/agente.txt"));while(scanner.hasNext()){agente=scanner.nextLine();}scanner.close();}catch(IOExceptione){e.printStackTrace();}try{Scannerscanner=newScanner(newFile("C:/Users/YPY/Documents/ip.txt"));while(scanner.hasNext()){ip=scanner.nextLine();}scanner.close();}catch(IOExceptione){e.printStackTrace();}ConectaBdconect=newConectaBd();ResultSetresultado=conect.conecta(agente,ip);try{if(resultado.next()){Stringid=resultado.getString("id");Stringcliente=resultado.getString("cliente");Stringdestino=resultado.getString("destino");if(destino.length()==12){destino=destino.substring(2);}jTextField4.setText(id);jTextField6.setText(destino);jTextField5.setText(cliente);}else{jTextField4.setText("");JOptionPane.showMessageDialog(null,"NUMERO NÃO ENCONTRADO!","",JOptionPane.WARNING_MESSAGE);}}catch(SQLExceptionex){Logger.getLogger(Jan1C2.class.getName()).log(Level.SEVERE,null,ex);}}
lucasportela
Pelo erro, está dizendo que sua consulta está incorreta, ao invés de imprimir uma mensagem na exceção, por favor, deixe mostrar o stacktrace, senão não ajuda muito.
Verifica se o nome das colunas e da tabela estão corretos, algum erro de sintaxe
nel
lucasportela:
nel,
catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");// ex.printStackTrace(); returnnull;}
Veja que na saída ele imprimiu que não foi possível carregar o driver, sendo assim, faz todo sentido o que o champs falou.
E o NullPointer ocorre na linha
if(resultado.next()){
Porque ele retornou null e tentou buscar o proxímo.
É pior do que eu pensei.
Pedro Ribeiro, não se trata exceção dessa forma cara e se resolver, por algum motivo tratar assim, sempre acompanhe o log e faça a verificação no retorno do método, verificando se não terá um retorno nulo. Na pressa, questionei erroneamente o cara, mas na realidade, está correte. A falta de um driver de JDBC não pode gerar uma exceção desse tipo.
Um erro está na string sql que faz o select! Voce tenta capturar três: id, cliente e destino mas o seu select só tem select cliente, destino…
voce no sql não está recuperando o id então sugiro que faça o seguinte:
selectid,cliente,destinofrom....
e não
selectcliente,destinofrom...
ou então faça select * from …
Espero ter ajudado…
até mais
lucasportela
Quando você instalou o MySQL, você alterou a porta?
coloque a porta que você configurou para acessar, não deve ser a 3306 pra você. Ou reinstale o MySQL com a configuração padrão.
E ainda tem o detalhe que o geraldocantelli falou acima.
P
Pedro_Ribeiro
Achei o problema amigos, eu fechava a conexão antes de retornar o ResultSet, o problema é que seria interessante eu fechar essa conexão, alguma ideia de como fazer isso sem atrapanhar o aplicativo?
publicclassConectaBd{publicstaticResultSetconecta(Stringagente,Stringip){Stringdriver="com.mysql.jdbc.Driver";//Classe do driver JDBCStringbanco="ypy_trix";//Nome do Banco criadoStringusuario="preditivo";//Usuário do bancoStringsenha="ypy1212";//Senha de conexãoStringstr_conn="jdbc:mysql://"+ip+":3306/"+banco;//URL de conexãotry{Class.forName(driver);Connectionconn=DriverManager.getConnection(str_conn,usuario,senha);Statementstmt=conn.createStatement();Stringsql="SELECT id, destino, cliente FROM active_calls where agente = '"+agente+"'";ResultSetrs=stmt.executeQuery(sql);// FOI SO COMENTAR ESSE LINHA => conn.close();return(rs);}catch(ClassNotFoundExceptionex){System.out.println("Não foi possível carregar o driver.");ex.printStackTrace();returnnull;}catch(SQLExceptionex){System.out.println("Problema com o SQL");ex.printStackTrace();returnnull;}}}
lucasportela
Você tem quer ter um método que somente cria a conexao, no seu caso, esse conecta ai…ele conecta e já faz uma consulta.
Crie um método para conexão e outro para consulta, sendo no da consulta, você usária o resultset dentro deste método e retornaria o valor da consulta.
a idéia é +ou- essa, apesar de que o exemplo não faz exatamente o que você quer, mas você tem que separar as ações de suas classes, não pode ter um método faz tudo…
privatevoidchutaBateEscanteioCabeceiaFazGol(){}
tem que separar cada funcionalidade
C
champs
Ae nel espertão, ve se agora aprende a analisar o stack trace igual um bom programador java antes de vir dar pedrada. Como vossa senhoria pode ver, está escrito no começo NÃO FOI POSSÍVEL CARREGAR O DRIVER. Não resolveu o problema, mas pelo menos tirou um grande empecilho.
nel
Tsc, eu aceitei a crítica numa boa, não há motivos para estresse. E não tente me julgar, nem o mínimo que seja, por eu ter visto apressado o post do colega e executada uma crítica. E a pergunta que eu lhe fiz faz total sentido, porque não deve acontecer um erro desse tipo devido a uma falha de Driver com esta.
Eu não vi a primeira linha do stacktrace, confesso, mas houve também uma má pratica na execução do código do colega.
Portanto, não sou melhor e nem pior do que ninguém, simplesmente devido a pressa (já que estou no trabalho…) olhei por cima e somente vi o NullPointer.
Abraços.
C
champs
Blz cara, na boa, mas novamente, como toda pessoa que tem gabarito ja formado em java, analisa antes de responder de forma agressiva, é uma falta de respeito inclusive com quem postou o tópico, pois se ele não tivesse visto o detalhe do driver jdbc, poderia ficar dias patinando até achar o erro. Mas eu tenho notado isso de uma forma geral no fórum, então de boa, foi mal se eu pareci meio grosseiro.
nel
Eu não tive a intenção de ser grosseiro quando lhe fiz a pergunta. Era uma pergunta como outra qualquer.
De toda forma o que eu disse estava correto, explicando sobre o erro. A intenção era faze-lo verificar onde estava a referência nula, mas não fui claro.
Está tudo certo, faz parte como um todo.
Abraços!
P
Pedro_Ribeiro
lucasportela:
Você tem quer ter um método que somente cria a conexao, no seu caso, esse conecta ai…ele conecta e já faz uma consulta.
Crie um método para conexão e outro para consulta, sendo no da consulta, você usária o resultset dentro deste método e retornaria o valor da consulta.
a idéia é +ou- essa, apesar de que o exemplo não faz exatamente o que você quer, mas você tem que separar as ações de suas classes, não pode ter um método faz tudo…
privatevoidchutaBateEscanteioCabeceiaFazGol(){}
tem que separar cada funcionalidade
Valeu amigo, vou fazer.
Voce cria uma variável conexao, de que tipo é a mesma?