Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

15 respostas
B

Pessoal, to começando…

Tentei achar a solução, ate vi no forum que o provavel erro é que tem algo nao inicializado mas na boa nao achei.
o erro é o seguinte:

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException
at findRecord.actionPerformed(findRecord.java:25)

o codigo é esse:

public class agenda extends JFrame{
	private Connection dbconn;
	private creategui screenvar;
	
	public agenda(){
		try {
	         String url = "jdbc:odbc:BakeryBook";

	         Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
	         dbconn = DriverManager.getConnection( url );
	         //msgout.append( "Connection successful\n" );
	      }
	      catch ( ClassNotFoundException cnfex ) {
	         // process ClassNotFoundExceptions here
	         cnfex.printStackTrace();
	         //msgout.append( "Connection unsuccessful\n" +
	           //             cnfex.toString() );
	      }
	      catch ( SQLException sqlex ) {
	         // process SQLExceptions here
	         sqlex.printStackTrace();
	         //msgout.append( "Connection unsuccessful\n" +
	           //             sqlex.toString() );
	      }
	      catch ( Exception excp ) {
	         // process remaining Exceptions here
	         excp.printStackTrace();
	         //msgout.append( excp.toString() );
	      }

		screenvar = new creategui(dbconn);
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		agenda ag = new agenda();
		

	}

}


class creategui extends JPanel{
	JTextField buscatx;
	botao bton;
	JFrame frame;
	private Connection dbconn;
	private creategui creategui;
	QueryTableModel qry;
	JTable jtbl;
	JScrollPane jspane;


	public creategui(Connection dbc){
		dbconn = dbc;
		
	
		buscatx = new JTextField(20);
		JLabel lbusca = new JLabel("Buscar");
		
		
		GridBagLayout framegbl = new GridBagLayout();
		GridBagLayout gbl = new GridBagLayout();
		frame = new JFrame();
		JPanel labelpane = new JPanel(gbl);
		bton = new botao(dbc,creategui);
		qry = new QueryTableModel(dbc,creategui);
		qry.query();
		jtbl = new JTable( qry );
		jspane = new JScrollPane( jtbl );
		
		
		int row = 0;
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.NONE;
        gbc.weightx = 0;
        gbc.weighty = 0;
        gbc.insets = new Insets(0,5,0,0);
    
        add(labelpane,lbusca,gbl,gbc,0,row,1,1);
        row++;
        add(labelpane,buscatx,gbl,gbc,0,row,1,1);
        gbc.insets = new Insets(0,0,0,0);
        //row++;
        add(labelpane,bton,gbl,gbc,1,row,1,1);
        row++;
        add(labelpane,jspane,gbl,gbc,0,row,1,1);
        
    	add(frame,labelpane,framegbl,gbc,0,0,1,1);
    	frame.pack();
    	frame.setVisible(true);
    	
    	
	    frame.addWindowListener(
  	          new WindowAdapter() {
  	             public void windowClosing( WindowEvent e ) {
  	               System.exit( 0 );
  	             }
  	          }
  	       );

	}
	
    public static void add(
    		Container container,
    		Component c,
    		GridBagLayout gbl,
    		GridBagConstraints gbc,
    		int x, int y, int w, int h)
    	    {
    		gbc.gridx = x;
    		gbc.gridy = y;
    		gbc.gridwidth = w;
    		gbc.gridheight = h;
    		gbl.setConstraints(c,gbc);
    		container.add(c);
    	    }
	
}



class findRecord implements ActionListener {
	private creategui screenvar;
	private Connection dbconn;
	
	public findRecord( Connection dbc, creategui scv ){
		dbconn = dbc;
		screenvar = scv;
	}
	
	public void actionPerformed( ActionEvent e ){
		try{
			String numstrg = new String();
			//for (int i=0; i < screenvar.buscatx.getText().length();i++){
				//numstrg += screenvar.buscatx.getText().substring(i,i+1);
(Linha 25) ------------>	numstrg = screenvar.buscatx.getText();
			//}// for
		if (!numstrg.equals("")){
			Statement statement = dbconn.createStatement();
			String query = "Select * from Orders";
			dbconn.nativeSQL(query);
			ResultSet rs = statement.executeQuery( query );
		
		}// if

		}// try
		catch (SQLException sqlex){
			sqlex.printStackTrace();
		}// catch
	}


}

Valeu

15 Respostas

renzonuccitelli

Hipóteses:

1)O argumento SCV passado foi null, Da pra testar isso dando um print.
2)O Argumento buscatx não foi incializado e está nulo. Também da pra testar dando print

Algumas dicas:

Dê nomes sugestivos para suas variáveis, não abrevie. Isso ajusa na compreensao do código e facilita a manutenção. Se vc ficar alguns meses sem mexer nesse projeto, até mesmo vc terá dificuldade de entedê-lo.
Também não é boa prática deixar o atributo de uma classe público, como é o caso de buscatx. Isso prejudica o encapsulamento. Faça os bons e velhos métodos setters e gettes. As próprias IDE´s geram ele pra vc.

M

Você percebeu que, na linha 49, creategui é o nome do objeto criado que é exatamente o nome da classe?

......
private creategui creategui;
.......

Aliás, para que isso existe?!? Elimine essa variável e nas linhas 67 e 68, durante a criação de componentes, se for preciso passar um JPanel como argumento, passe o próprio objeto em criação, usando a palavra chave ‘this’.

Além de não seguir as convenções (veja aqui), isso confunde os programadores, te confunde e pode, em alguns casos, confundir a JVM. Para nome de classes use sempre letras maiúsculas no início, como por exemplo:

Object
String
Math
NullPointerException // repare que cada nove palavra começa com maiúscula
ActionListener
Statement

Logo, em seu código deveríamos ter as classes:

Agenda
CreateGUI // como GUI é uma sigla, deixe todas em maiúscula
FindRecord

E altere para esses nomes os construtores as outras ocorrências de classe.

B

Muito obrigado em poucas palavras vcs deram uma aula e tanto pra mim.
Funcionou o programa.

Vou seguir as convenções.

Valeu

fabio_kaspar

Olá pessoal, estou precisando de uma ajudinha aqui. Estou fazendo um programa de cadastro e quando compilo o programa ele roda normalmente mas quando clico em um botão para ele inserir os dados do formulário no Mysql ele gera o seguinte erro:

Exception in thread AWT-EventQueue-0 java.lang.NumberFormatException: For input string: “”

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at cadastro$BtnCadClActionListener.actionPerformed(cadastro.java:335)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

Eu já fiz de tudo pra corrigir o erro mas não consegui de jeito nenhum. Se vocês puderem me dar algumas dicas de como usar o ActionListener pra inserir os dados do formulário no banco
já é uma grande ajuda. Eu vou postar o método actionPerformed aqui e o essencial do código para se identificar o erro:

// código não postado
public cadastro(){
	super();
	setBounds(500,500,728,500);
	setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
	try {
	jbInit();
        teste();
 
   } catch (Throwable e) {
	JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
  }
}
/// código não postado
	pnlSul.add(btnCadCl);
	btnCadCl.setText("cadastrar cliente");
	btnCadCl.setBounds(5, 30, 115, 25);
	btnCadCl.addActionListener(new BtnCadClActionListener());

public static Connection getConnection(){
    // base de dados é "javabd2"
    String url = "jdbc:mysql://127.0.0.1/javabd2";
    String usuario = "root";
    String senha = null;

    try{
      Class.forName("com.mysql.jdbc.Driver");
      Connection conn = DriverManager.getConnection(url, usuario, senha);
      java.sql.Statement select = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
      ResultSet rs = select.executeQuery("SELECT * FROM cliente"); 
      if (rs == null){
    	  System.out.println("rs está nulo");
      }else{
    	  System.out.println("rs está cheio"); 
      }
      		if (rs.next()){
      	System.out.println(" há dados");
      	
      } else{
      	System.out.println("não há dados");
      }
      	return conn;
    }
    
    catch(SQLException ex){
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("VendorError: " + ex.getErrorCode());
      return null;
    }
    catch(Exception e){
      System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
      return null; 
    }
  }

     public void teste(){
	cadastro.getConnection();
	System.out.println("conexão aberta");
  }

     
     private class BtnCadClActionListener implements ActionListener {
    		public void actionPerformed(ActionEvent e){ 
    		try {
    			String nome = txtNmCl.getText();
    			String end = txtEndCl.getText();
    			int rg =Integer.parseInt(txtNmCl.getText());
    			int cpf =Integer.parseInt(txtCpfCl.getText());
    			int tel = Integer.parseInt(txtTelCl.getText());
    			java.sql.Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
             String query = "INSERT INTO cliente (cl_nome, cl_rg, cl_cpf, cl_tel, cl_end) " +
    	"VALUES('"+nome+"','"+rg+"','"+cpf+"','"+tel+"','"+end+"')";
			 
			int vs = stmt.executeUpdate(query);
		    
			 
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();

			
		  } 

	  }

  }

Desde já agradeço. Conto com o apoio de vcs.

ViniGodoy

Olá fábio. Ao invés de sair ressuscitando tópicos pré-históricos no GUJ, por que não abre o seu próprio tópico?

O problema é que você está chamando Integer.parseInt() em algum campo que nenhum texto está digitado. É sempre bom testar essa situação, antes de fazer o parse:

if (txtNmCl.getText().isEmpty() {
   JOptionPane.showMessageDialog(this, "Por favor, informe um RG!");
   return;
}
int  rg =Integer.parseInt(txtNmCl.getText());  
if (txtCpfCl.getText().isEmpty() {
   JOptionPane.showMessageDialog(this, "Por favor, informe um CPF!");
   return;
}

int cpf =Integer.parseInt(txtCpfCl.getText());  
if (txtTelCl.getText().isEmpty() {
   JOptionPane.showMessageDialog(this, "Por favor, informe um Telefone!");
   return;
}
int tel = Integer.parseInt(txtTelCl.getText());

Cuidado no tratamento de exceptions. Elas dão dicas valiosas do erro. Nesse caso, a exceção dizia:
"Problema no formato do número: A string de entrada era ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at cadastro$BtnCadClActionListener.actionPerformed(cadastro.java:335)

Note que a linha destacada em negrito mostra exatamente o local no seu ActionListener que o erro ocorreu.

fabio_kaspar

Já consegui arrumar o erro dos componentes nulos. Não está mais gerando aquele erro. Mas eu não estou conseguindo inserir os dados do formulário na tabela do Mysql.
Vou mostrar o método actionPerformed que eu arrumei:

private class BtnCadClActionListener implements ActionListener {
    		public void actionPerformed(ActionEvent e){ 
  
           
             if (!txtNmCl.getText().isEmpty()){
            	 String nome = txtNmCl.getText();
            	 return;
             }
             if (!txtRgCl.getText().isEmpty()){
            	 int rg =Integer.parseInt(txtNmCl.getText());
            	 return;
             }
             if (!txtCpfCl.getText().isEmpty()){
            	 int cpf =Integer.parseInt(txtCpfCl.getText());
            	 return;
             }
             if (!txtTelCl.getText().isEmpty()){
            	 int tel =Integer.parseInt(txtTelCl.getText());
            	 return;
             }
             if (!txtEndCl.getText().isEmpty()){
            	 String end = txtEndCl.getText();
            	 return;
             }
             String query = "INSERT INTO cliente (cl_nome, cl_rg, cl_cpf, cl_tel, cl_end) " +
         	"VALUES('"+nome+"','"+rg+"','"+cpf+"','"+tel+"','"+end+"')";
             try{

         		java.sql.Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
         	 ResultSet vs = stmt.executeQuery(query);
         		return;
   
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			return;
			}
      }

  }

O que será que está faltando no código?

ViniGodoy

E não dá mais nenhum erro? Note que se qualquer um dos seus campos estiver em branco o "return" irá fazer o código sair do método, sem executar o insert.

Outra coisa, use o PreparedStatement. Ele evita os casts e evita problemas caso o endereço do seu cliente contenha dados como "Próximo ao John's Pub" (pense na catástrofe que aquele apóstrofe faria no seu código):

private class BtnCadClActionListener implements ActionListener {
   public void actionPerformed(ActionEvent e){ 
      if (!txtNmCl.getText().isEmpty()){
         String nome = txtNmCl.getText();
         return;
      }

      if (!txtRgCl.getText().isEmpty()){
         int rg =Integer.parseInt(txtNmCl.getText());
         return;
      }

      if (!txtCpfCl.getText().isEmpty()){
         int cpf =Integer.parseInt(txtCpfCl.getText());
         return;
      }

      if (!txtTelCl.getText().isEmpty()){
         int tel =Integer.parseInt(txtTelCl.getText());
         return;
      }
      if (!txtEndCl.getText().isEmpty()){
         String end = txtEndCl.getText();
         return;
      }
      String query = "INSERT INTO cliente (cl_nome, cl_rg, cl_cpf, cl_tel, cl_end) VALUES(?, ?, ?, ?, ?)";
      try{
         PreparedStatement stmt = conn.prepareStatement(query);
         stmt.setString(1, nome);
         stmt.setInt(2, rg);
         stmt.setInt(3, cpf);
         stmt.setInt(4, tel);
         stmt.setString(5, end);
         ResultSet vs = stmt.executeQuery();
         return;
      } catch (SQLException e1) {         
         throw new RuntimeException(e);
      }
   }
}

E por que há apóstrofes no seu insert nos campos que são numéricos?

fabio_kaspar

Foi uma outra forma que encontrei de dar o insert. Agora eu alterei o código para essa forma que você colocou aqui no fórum mas mesmo assim ao clicar no botão para inserir os
dados ele não insere. Ainda assim acho que tem alguma coisa errada. Vou continuar procurando o erro.

fabio_kaspar

fabio kaspar:
Foi uma outra forma que encontrei de dar o insert. Agora eu alterei o código para essa forma que você colocou aqui no fórum mas mesmo assim ao clicar no botão para inserir os
dados ele não insere. Ainda assim acho que tem alguma coisa errada. Vou continuar procurando o erro. Se vc tiver uma idéia do possível erro me retorne por favor

ViniGodoy

Use um depurador. Aposto que seu código não está nem sequer chegando no insert. Use o debugger e teste isso.

fabio_kaspar

Acho que já constatei o erro. O método actionPerformed não executa nem o try e nem o catch só porque eu coloquei um código antes do try. Como será que corrige esse erro?

ViniGodoy
fabio kaspar:
Acho que já constatei o erro. O método actionPerformed não executa nem o try e nem o catch só porque eu coloquei um código antes do try. Como será que corrige esse erro?

Não, nada a ver. Provavelmente ele entra em algum daqueles return. Tente assim:

private class BtnCadClActionListener implements ActionListener {
   public void actionPerformed(ActionEvent e){ 
      String nome = txtNmCl.getText();
      int rg = txtRgCl.getText().isEmpty() ? 0 : Integer.parseInt(txtNmCl.getText());
      int cpf = txtCpfCl.getText().isEmpty() ? 0 : Integer.parseInt(txtCpfCl.getText());
      int tel = txtTelCl.getText().isEmpty() ? 0 : Integer.parseInt(txtTelCl.getText());
      String end = txtEndCl.getText();

      String query = "INSERT INTO cliente (cl_nome, cl_rg, cl_cpf, cl_tel, cl_end) VALUES(?, ?, ?, ?, ?)";
      try{
         PreparedStatement stmt = conn.prepareStatement(query);
         stmt.setString(1, nome);
         stmt.setInt(2, rg);
         stmt.setInt(3, cpf);
         stmt.setInt(4, tel);
         stmt.setString(5, end);
         ResultSet vs = stmt.executeQuery();
         return;
      } catch (SQLException e1) {         
         throw new RuntimeException(e);
      }
   }
}

Como eu falei, é bom você usar um depurador nesses casos. Ele te mostra exatamente como o seu código se comportou. Além disso, ainda não entendi pq vc tratava os campos numéricos como Strings no banco, lá no seu primeiro código.

fabio_kaspar

O depurador corrige o erro automaticamente?

fabio_kaspar

Já achei a solução. Os componentes campo.getText() não estavam nulas e sim o Statement era que estava, pois eu tinha me esquecido de inicializar a variável de conexão.
Valeu pelas dicas

ViniGodoy

Não. Ele permite que você veja a execução do programa linha a linha. Dá uma olhada:
[youtube]http://www.youtube.com/watch?v=joWldbcp1So[/youtube]

Não. O correto é usar o PreparedStatement, como mostrei.
Ainda assim, a sintaxe do SQL básico, se você fizer por concatenação (o que é errado, repito) seria só usar ‘apostrofe’ para as Strings, Datas e, em alguns bancos, tipos booleanos. Os demais dados ficam sem.

Agora, com o PreparedStatement, você não precisa se incomodar se precisa ou não de apóstrofes, nem com o formato das datas no banco, nem em como representar floats, nem se o tipo booleano nesse ou naquele banco específico exige ou não apóstrofe. Você também não precisa se preocupar com o fato do seu usuário poder ter escrito um apóstrofe na string dele, o que invalida seu SQL quando você usa concatenação.

Opa. O erro de NullPointerException acusa que linha do seu código? Esse erro indica que existe uma variável nula no seu código, e que você está tentando chamar um método dela. O depurador pode te ajudar a encontrar que variável é essa.

Criado 5 de janeiro de 2009
Ultima resposta 21 de jul. de 2010
Respostas 15
Participantes 5