Erro ao comparar 2 Strings

8 respostas
G

Opa blz ai pessoal ?

Então estou comparando uma String que esta em uma mascara assim “dd/mmm/aaaa” para ver se ela esta vazia ou n … mas n estou conseguindo da um erro de evento

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at JanelaAdmConsultaFiltro.selecionaFiltros(JanelaAdmConsultaFiltro.java:229) at JanelaAdmConsultaFiltro$EntraBotaoPesquisar.keyPressed(JanelaAdmConsultaFiltro.java:265) at java.awt.Component.processKeyEvent(Unknown Source) at javax.swing.JComponent.processKeyEvent(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.KeyboardFocusManager.redispatchEvent(Unknown Source) at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source) at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source) at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(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)

Será que alguem pode me ajudar ?

8 Respostas

feltraco

cara posta o codigo ai pra gente poder ajudar melhor…

soh com ess erro ai fica dificil…

:wink:

T

Primeiro compare a string com null, depois compare-a com o que você quer comparar (usando equals, compareTo ou seja lá o que for.

String s = algumMetodoQuePodeRetornarNullOuUmaStringQualquer();
if (s != null) {
    // Agora você pode comparar a string sem dar null pointer exception
    ...
}
G

Hahaha é que muito extenso o negocio mais vamos tentar né :P`

La vai ...

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.border.Border;
import javax.swing.text.MaskFormatter;

import sun.awt.FontConfiguration;


public class JanelaAdmConsultaFiltro extends JFrame{
	
	JDesktopPane recebeMenu,recebeTabela;
	Border bordaPreta;
	Color corCinza;
	Font FonteBlue;
	
	
	JButton botaoPesquisar,botaoCancelar,botaoLimpar;
	JTextField BuscaPeriodoFinal;
	JComboBox BuscaLocal,BuscaUsuario,BuscaEstado,BuscaTecnico;
	MaskFormatter   formataData = null;
	MaskFormatter formataId  = null;
	JTextField BuscaId;
	UseJCalendar DataInicio;
	UseJCalendar DataFinal;
	
	void entraNoFiltro(JDesktopPane JanelaPrincipal){
		
		JanelaPrincipal.removeAll();
		bordaPreta = BorderFactory.createLineBorder(Color.black);
		corCinza = new Color(238,233,233);
		
	
		try {   
			formataData = new MaskFormatter("##/##/####");   
			formataId = new MaskFormatter("##############");  
			   
	    } catch (java.text.ParseException e) {   
	      System.out.println("Erro ao formar data."); 
	    }
		
		
	    String[] recebeUsuario = new JanelaAdmConsultaFiltro().pegaCombobox(new JanelaAdmConsultaFiltro().pegaTamanhoComboBox("nome","Login"),"nome","Login");
		String[] recebeTecnico = new JanelaAdmConsultaFiltro().pegaCombobox(new JanelaAdmConsultaFiltro().pegaTamanhoComboBox("tecnico","Tecnico"),"tecnico","Tecnico");
		
	//Componetens linha grafica;
		JLabel textoGrafico = new JLabel("Consultas por Filtros");
		textoGrafico.setOpaque(true);   
		textoGrafico.setBackground(corCinza);
		textoGrafico.setForeground(Color.blue);
		textoGrafico.setBounds(10, 10, 730, 15);
		
		
	//Componentes do Id
		JLabel textoId = new JLabel("Id:");
		textoId.setBounds(10,30,100,20);
		BuscaId = new JTextField(new LimitadorTexto(14), "", 1);  
 
	
		
		BuscaId.setBorder(bordaPreta);
		BuscaId.setBounds(70, 30, 100, 20);
		
		
	//Componentes da Data
		JLabel textoDataInicial = new JLabel("Período:");
		textoDataInicial.setBounds(360, 30, 100, 20);
		
		JLabel textoDataFinal = new JLabel("até");
		textoDataFinal.setBounds(524, 30, 100, 20);
	
	
	//Componentes de Usuário	
		JLabel textoUsuario = new JLabel("Usuário:");
		textoUsuario.setBounds(10,60 , 100, 20);
		
		BuscaUsuario = new JComboBox(new JanelaAdmConsultaFiltro().comparaTecnicoUsuario(recebeUsuario,recebeTecnico));
		BuscaUsuario.setBounds(70,60 , 270, 20);
	
		
	//Componentes de Local	
		JLabel textoLocal = new JLabel("Local:");
		textoLocal.setBounds(10,90 , 100, 20);
		
		BuscaLocal = new JComboBox(new JanelaAdmConsultaFiltro().pegaCombobox(new JanelaAdmConsultaFiltro().pegaTamanhoComboBox("local","Local"),"local","Local"));
		BuscaLocal.setToolTipText("Escolha o local de origem");
		BuscaLocal.setBounds(70, 90, 270, 20);
		
	
	//Componentes de Estado	
		JLabel textoEstado = new JLabel("Estado:");
		textoEstado.setBounds(360,60,100,20);
		
		BuscaEstado = new JComboBox(new JanelaAdmConsultaFiltro().pegaCombobox(new JanelaAdmConsultaFiltro().pegaTamanhoComboBox("estado","Estado"),"estado","Estado"));
		BuscaEstado.setBounds(420, 60, 270, 20);
		
	
	//Componentes de Técnico	
		JLabel textoTecnico = new JLabel("Técnico:");
		textoTecnico.setBounds(360, 90, 100, 20);
		
		BuscaTecnico = new JComboBox(recebeTecnico);
		BuscaTecnico.setBounds(420, 90, 270, 20);
		
		
		
	//Componete Linha Grafica recebeBusca
		JLabel textoGraficoResultado = new JLabel("Dados");
		textoGraficoResultado.setOpaque(true);   
		textoGraficoResultado.setBackground(corCinza);
		textoGraficoResultado.setForeground(Color.blue);
		textoGraficoResultado.setBounds(10, 10, 730, 15);
		
	//Os dois Desktops	
		recebeMenu = new JDesktopPane();
		recebeMenu.setBorder(bordaPreta);
		recebeMenu.setBounds(10, 10, 750, 150); 
		
		
		recebeTabela = new JDesktopPane();
		recebeTabela.setBorder(bordaPreta);
		recebeTabela.setBounds(10, 180, 750, 300);
		
    //Calendario
		
		new UseJCalendar().criaCalendario(recebeMenu);
		
		
	//Botões
		
		botaoPesquisar = new JButton("Pesquisar");
		botaoPesquisar.setBounds(10,120,100,20);
		
		botaoLimpar = new JButton("Limpar");
		botaoLimpar.setBounds(120,120,100,20);
		
		botaoCancelar = new JButton("Sair");
		botaoCancelar.setBounds(230,120,100,20);
		
		
	//Adiciona os componentes aos Desktop	
		recebeMenu.add(textoGrafico);
		recebeMenu.add(textoId);
		recebeMenu.add(BuscaId);
		recebeMenu.add(textoDataInicial);
		recebeMenu.add(textoDataFinal);
		recebeMenu.add(textoUsuario);
		recebeMenu.add(BuscaUsuario);
		recebeMenu.add(textoLocal);
		recebeMenu.add(BuscaLocal);
		recebeMenu.add(textoEstado);
		recebeMenu.add(BuscaEstado);
		recebeMenu.add(textoTecnico);
		recebeMenu.add(BuscaTecnico);
		recebeMenu.add(botaoPesquisar);
		recebeMenu.add(botaoLimpar);
		recebeMenu.add(botaoCancelar);
		recebeTabela.add(textoGraficoResultado);
		
		JanelaPrincipal.add(recebeMenu);
		JanelaPrincipal.add(recebeTabela);
		JanelaPrincipal.updateUI();
		
	//Ações dos botões
	//Evento Enter	   
	EntraBotaoPesquisar  action1 = new EntraBotaoPesquisar();
		BuscaId.addKeyListener(action1);
		BuscaUsuario.addKeyListener(action1);
		BuscaLocal.addKeyListener(action1);
		BuscaEstado.addKeyListener(action1);
		BuscaTecnico.addKeyListener(action1);
		botaoPesquisar.addKeyListener(action1);
	
	//	EntraBotaoLimpar action2 = new EntraBotaoLimpar();
		//botaoLimpar.addActionListener(action2);
		
	//	EntraBotaoSair action3 = new EntraBotaoSair();
	//	botaoCancelar.addActionListener(action3);
		
	}
	
	 void selecionaFiltros(JDesktopPane recebeDesktop){
		
	//Variaveis
		 String recebeIdBusca,recebeEstadoBusca,recebeLocalBusca,recebeUsuarioBusca,
		 recebeDataFinalBusca,recebeDataInicioBusca;
	//Atribuindo Valor	  
		 recebeIdBusca = BuscaId.getText();
		 recebeEstadoBusca = BuscaEstado.getSelectedItem().toString();
		 recebeLocalBusca = BuscaLocal.getSelectedItem().toString();
		 
		 recebeUsuarioBusca = BuscaUsuario.getSelectedItem().toString();
		 
		 recebeDataInicioBusca =  UseJCalendar.recebeDataInicio.getText();
		 recebeDataFinalBusca =   UseJCalendar.recebeDataFinal.getText();
		 
	//Cria Tabela de dados
		 JTable tabela = new JTable();
		 
			
	//Verifica campos preenchidos	
	if(recebeDataInicioBusca.equals("")){
		
		System.err.println("O erro ocorre quando ele compara aqui");
		
	}//else{
		
	//System.out.println("recebeDataInicioBusca:" +recebeDataInicioBusca);

					
				
		//		}
		
		
	}
		 
		 
		 

		 
		 
	 
	
	
	
	
	private class EntraBotaoPesquisar implements KeyListener{
		
	
			public   
			void  keyPressed(KeyEvent ev)   
			{   
			   // pega a tecla pressionada..   
			   int  tecla_pressionada = ev.getKeyCode();   
			   // se for o enter..   
			   if (tecla_pressionada == KeyEvent.VK_ENTER)   
			   {   
				  selecionaFiltros(recebeTabela);
				   
				   
			
			 botaoPesquisar.doClick();   
			    }   
			} 
				
				
			public void keyReleased(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}

			public void keyTyped(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}
		
		
			
			
	
}
	
	
	public String []  comparaTecnicoUsuario(String[] usuarios,String[] tecnicos){
		Vector recebeValor = new Vector();
		String [] recebeResultado;
	
		boolean confirma = false ;
		
		
		for (int i = 0; i < usuarios.length; i++) {
			for (int j = 0; j < tecnicos.length; j++) {
				
				if(usuarios[i].equals(tecnicos[j])){
					
					confirma = false;
					break;
					
				}else {
					confirma = true;
				
				}
				
			}
			if (confirma == true){
			recebeValor.add(usuarios[i]);
			}
		}
		
		
		
		recebeResultado = new String[recebeValor.size()+2];
		recebeResultado[0] ="";
		recebeResultado[1] ="Todos";
		int j = 0;
		for (int i = 2; i < recebeResultado.length; i++) {
			
			recebeResultado[i] = (String) recebeValor.get(j);
			j++;
		}
	return recebeResultado;
	}
	
	
	
	
	
	int pegaTamanhoComboBox(String CampoTabela,String Tabela){
		
		int contador=0;
		try{
			
			
			Connection conectar  = Conectando.getConnection();
			
			Statement st = conectar.createStatement();
			
			ResultSet resultado = st.executeQuery("select "+CampoTabela+" from "+Tabela);
		
			
			
		
			while(resultado.next()){
				contador++;
				
				
			}		
	
			
			st.close();
			conectar.close();
				
		}catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Erro ao conectar com o Banco de Dados",
					"Erro de conexão ",JOptionPane.ERROR_MESSAGE);
		}
		return contador;
	}
		
	String[] pegaCombobox(int numero,String CampoTabela,String Tabela){
		String [] vetorValor =  new String [numero+2];
		int i =2;
		try{
		Connection conectar  = Conectando.getConnection();
		Statement st = conectar.createStatement();;
		ResultSet resultado =  st.executeQuery("select "+CampoTabela+" from "+Tabela);
		
		
	
		vetorValor[0] = "";
		vetorValor[1] = "Todos";
		while(resultado.next()){
			
			vetorValor[i]= resultado.getString(CampoTabela);
			i++;
			
	}
		
		st.close();
		conectar.close();
		
		}catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Erro ao conectar com o Banco de Dados",
					"Erro de conexão ",JOptionPane.ERROR_MESSAGE);
		}
		return vetorValor;
		
	}
	
	/**String [] limpaUsuario(String[] vetorUsuario, String[] vetorTecnico){
		
		String[] recebeValorFinal;
		
	for (int i=0;i<vetorUsuario.length;i++){
		
		for(int j=0;j<vetorTecnico.length;i++){
			
			
			
		}
		
	}	
		
		
		
	}**/
	
	
		
    public static void main(String[] args) {
		

    	
    	
    	
	}
		
		

	
	

	}
>
G

Então pessoal ja resolvi o problema eu n sei pq o metodo .equals n funciona mesmo mais se eu usar os comparadores “==” funciona :stuck_out_tongue:

Muito estranho isto hien !!

mais blz ! Valeu a todos que ajudaram ai ^^

sapobomba

outra coisa, na linha 226 onde vc faz:

if(recebeDataInicioBusca.equals("")){ ... }

Teria de fazer isto:

if(recebeDataInicioBusca == null || recebeDataInicioBusca.equals("")){ ... }

é bom sempre testar se é null ou se é equals( “” ), pq nunca se sabe qual é o retorno.

abraço

Fox_McCloud

Meu, não faz isso! Espero que vc leia essa resposta…

[color=blue]==[/color] e [color=blue]equals[/color] são duas coisas diferentes, você não deve usar [color=blue]==[/color] levianamente… você pode acabar comparando se os dois lados da expressão são Strings, e não se o conteúdo deles é igual.

O seu problema é que se a variável recebeDataInicioBusca for nula, você estará na verdade tentando fazer algo como null.equals(""), por isso o NullPointerException!

Você pode fazer como já foi sugerido, e testar se a variável é nula:

if(recebeDataInicioBusca!=null && recebeDataInicioBusca.equals("")){ System.err.println("String vazia") }
Ou, o que eu acho ainda mais fácil, inverta as coisas, assim:

if("".equals(recebeDataInicioBusca)){ System.err.println("String vazia") }
Invertendo, o [color=blue]""[/color] nunca será nulo, e se o lado direito da expressão (a variável recebeDataInicioBusca) for null, não será igual ao [color=blue]""[/color] e não irá disparar um NullPointerException.

Agora, se a idéia é testar se a entrada no campo é vazia (ou seja, validar o campo), o melhor jeito é assim:

if(recebeDataInicioBusca==null || recebeDataInicioBusca.trim().length()==0){ System.err.println("String vazia") }
Dessa forma você testa se é nulo e verifica se o tamanho da String, removidos os espaços à esquerda e à direita, é maior do que zero caracteres.

Mais uma explicação: no código anterior, o OU de curto-circuito [color=red]||[/color] garante que se a primeira condição for verdadeira ([color=blue]recebeDataInicioBusca==null[/color]), a segunda condição nem será testada ([color=blue]recebeDataInicioBusca.trim().length()==0[/color]), tornando impossível a ocorrência de um NullPointerException.

Se quiser mais explicações, disponha, mas realmente espero que você leia essa resposta para não fazer nenhuma Hgada!

:wink:

sapobomba

Dae galera,

Tem que ver se pro cara tem diferença entre ser vazio (String x = “” ) ou String x = null… pq ja vi acontecer de por exemplo um post em um form no firefox retornar “” e no internet explorer retornar null ao dar o get no request. Por isso sempre verifico com ou e não com && como você fez.

E outra, eu sei que == é diferente de equals, afinal, se eu não não soubesse isso em 4 anos programando java, eu já poderia ter me aposentado dessa profissão… :wink:
hehe

abraço

Fox_McCloud

Exatamente, o terceiro if que eu indiquei cobre mais possibilidades de retornos (é o básico de validação). Além disso podem entrar outras validações, máscaras, ver se o valor enviado naquele campo é válido, etc…

Quanto ao ==, falei dele por causa da conclusão [color=red]errada[/color] que o Gothicoil tirou:

Mas se ele ler as explicações que coloquei acima não terá problemas!

:wink:

Criado 12 de fevereiro de 2008
Ultima resposta 12 de fev. de 2008
Respostas 8
Participantes 5