[wdl] Erro ao importar TXT - java.lang.NullPointerException - (ImportaTXT.java:126)

9 respostas
wfrsilva

Oi pessoal,
Estou com certa dificuldade em descobrir o que esta de errado no meu projeto:
http://www.wfrsilva.xpg.com.br/projetoFinalWdl1001.rar (502kb)

Ao tentar importar um txt (src\controle10\jogadores.txt) acionado pelo botao inferior (TXT).

Ocorre os seguinte erro:

java.lang.NullPointerException

at controle10.ImportaTXT.insereJgdrDoTxtParaArrayList(ImportaTXT.java:126)

at controle10.ImportaTXT.lerArquivo(ImportaTXT.java:65)

at grafico10.TtlRsvTelaPrincipal.actionPerformed(TtlRsvTelaPrincipal.java:246)

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)

Nao sei onde estou errando.
Salvei o projeto nesse endereco pois sei q o grupo nao aceita anexos.

Obrigado pela ajuda

9 Respostas

jayro

Cara… não simulei o projeto no eclipse… mas o erro é por que tem algum acesso a um método de um objeto que não foi instanciado. Tu sabe/consegue debugar o código e verificar em que parte está dando o erro no arquivo ImportaTXT.java ?

:slight_smile:

wfrsilva

[color=red]at controle10.ImportaTXT.insereJgdrDoTxtParaArrayList(ImportaTXT.java:126)
titularesReservas.contrataJogadorTXT(jogador);[/color]

[color=blue] at controle10.ImportaTXT.lerArquivo(ImportaTXT.java:65)
insereJgdrDoTxtParaArrayList(linha);[/color]

public void lerArquivo() throws Exception {
		
		JFileChooser abrir = new JFileChooser(); 
				
	    int retorno = abrir.showOpenDialog(null); 
	    
	       if (retorno==JFileChooser.APPROVE_OPTION){
	    	   String nomeArquivo = abrir.getSelectedFile().getAbsolutePath();
	    	   System.out.println(nomeArquivo);
	    	   System.out.println();
				FileReader ler = new FileReader(nomeArquivo);
				BufferedReader leitor = new BufferedReader(ler);
				String linha;
				while ((linha = leitor.readLine())!= null){
					//chama o metodo que vai inseirr o jogador
					System.out.println(linha);

///////////////////////////////////////////////////////////////////////////////////////////////////////
					[color=red]insereJgdrDoTxtParaArrayList(linha);[/color] 	
///////////////////////////////////////////////////////////////////////////////////////////////////////					

JOptionPane.showMessageDialog(null, "linha: " + linha ,linha, JOptionPane.WARNING_MESSAGE);
				} // while
		
	    } // if
	} // metodo lerArquivo



public void [color=red] insereJgdrDoTxtParaArrayList[/color](String linha){

		String [] linhaJogadorTxt = linha.trim().split(";");
		
		linhaJogadorTxt[0] = linhaJogadorTxt[0].trim();
		linhaJogadorTxt[1] = linhaJogadorTxt[1].trim();
		linhaJogadorTxt[2] = linhaJogadorTxt[2].trim();
		linhaJogadorTxt[3] = linhaJogadorTxt[3].trim();
		linhaJogadorTxt[4] = linhaJogadorTxt[4].trim();
		
		JOptionPane.showMessageDialog(null, 
				"linha: " + linha +  
				"\n linhaJogadorTxt[0] = |" + linhaJogadorTxt[0] + "|" + 
				"\n linhaJogadorTxt[1] = |" + linhaJogadorTxt[1] + "|" + 
				"\n linhaJogadorTxt[2] = |" + linhaJogadorTxt[2] + "|" + 
				"\n linhaJogadorTxt[3] = |" + linhaJogadorTxt[3] + "|" +
				"\n linhaJogadorTxt[4] = |" + linhaJogadorTxt[4] + "|"  ,
				
				linhaJogadorTxt[0], JOptionPane.WARNING_MESSAGE);
		
		
		
		
		String nomeJg = String.format("%s",linhaJogadorTxt[0]);
		System.out.println("nomeJg : " + nomeJg ) ;
		int indtJg  =  Integer.parseInt( linhaJogadorTxt[1] ) ; 
		String pscAtualJgdr = linhaJogadorTxt[2].toUpperCase();
		String pscOficioJgdr = linhaJogadorTxt[3].toUpperCase();
		int idcTtlr = Integer.parseInt( linhaJogadorTxt[4] ) ;
		boolean ehTit = false;
		
		
		IncluiJogadorPainel incluiRJogadorPainel = new IncluiJogadorPainel();
		
		incluiRJogadorPainel.mtdSetaNomeJgdr(nomeJg);
		incluiRJogadorPainel.mtdSetaIdentidadeJgdr(indtJg);
		incluiRJogadorPainel.mtdSetaPosicaoAtualJgdr(pscAtualJgdr);
		incluiRJogadorPainel.mtdSetaPosicaoOficioJgdr(pscOficioJgdr);
		incluiRJogadorPainel.mtdSetaIndiceTtlrddJgdr(idcTtlr);
		
		
		if ( incluiRJogadorPainel.validarDadosInseridosPeloTreinador() ) {
			
			Jogador jogador = new Jogador (
					incluiRJogadorPainel.mtdPegaNomeJgdr() , 
					incluiRJogadorPainel.mtdPegaIdentidadeJgdr() , 
					incluiRJogadorPainel.mtdPegaPosicaoAtualJgdr(), 
					incluiRJogadorPainel.mtdPegaPosicaoOficioJgdr(), 
					incluiRJogadorPainel.mtdPegaIndiceTtlrddJgdr() , 
					false);

///////////////////////////////////////////////////////////////////////////////////////////////////////						
			[color=blue]titularesReservas.contrataJogadorTXT(jogador);[/color]
///////////////////////////////////////////////////////////////////////////////////////////////////////
		
	} // insereJgdrDoTxtParaArrayList

TtlRsvTelaPrincipal.java
[color=green]at grafico10.TtlRsvTelaPrincipal.actionPerformed(TtlRsvTelaPrincipal.java:246)[/color]

public void actionPerformed(ActionEvent e) {
		if( e.getSource() == contratarJogadorJB ) {
			this.contratarJogadorParaElenco();
		} // if contratarJogadorJB
		else if( e.getSource() == demitirJogadorJB ){
			this.demitirJogadorNoElenco();
		}  // else if demitirJogadorJB
		else if( e.getSource() == lerJogadorTxtJB ){
			try {

///////////////////////////////////////////////////////////////////////////////////////////////////////
				[color=green]importaTXT.lerArquivo();[/color]
///////////////////////////////////////////////////////////////////////////////////////////////////////

			} catch (Exception e1) {
				e1.printStackTrace();
			 } // catch
		     
	} // actionPerformed
wfrsilva

Espero que essses trechos tenaham ajudado.
Obrigado

TheKill

o split quebra a String…
vai ter problemas com ele…

utilize de substring se for tamanhos fixos…
ou então use algo para delimitar o tamanho fixo como por exemplo (tab) ou (|)
sempre que chegar nele, vc sabe que terminou aquela informação e seta no atributo.

Seu problema é pelo uso errado do split

wfrsilva

Olha, eh provavel, mas nao eh 100% certeza disso.
Pois o mesmo split ja é utilizado de forma manual e nao apresenta problema.
Consigo cadastrar os jogadores um a um de forma manual.
Aih usando essa mesma metodologia, estou tentando fazer de forma a carregar uma lista de jogadores contida no TXT.

Assim penso q nao pode ser o split nesse caos, se ja consigo utiliza-lo de forma correta qdo cadastro os jogadores um a um de forma manual.

Obrigado pela ajuda

TheKill

Como falei anteriormente pode ser o split sim.

uma vez que usou ele por exemplo para cadastrar, como vc mesmo falou…
e depois usou para consultar… na primeira etapa ele quebrou tudo…
na segunda vez jah talvez nao tivece mais da forma correta…

Bom, eu acho que é isso… se não for tem que analisar, experimente debugar

wfrsilva

Eclipse Galileo
Estou sim debugando
colocando breakpoints nos locais acusados pelo eclipse

Consigo inserir manualmente pelos metodos:

* Acionado pelo botao contratarJogadorJB chamo o metodo TtlRsvTelaPrincipal.contratarJogadorParaElenco;
* no metodo   contratarJogadorParaElenco :
      o instancio o incluiRJogadorPainel; 
      o apos preencher os dados do jogador, ao clicar no OK (Adicionar), chamo o metodo IncluiJogadorPainel.validarDadosInseridosPeloTreinador:
      o no validarDadosInseridosPeloTreinador é feito uma checagem dos dados, estando tudo ok, retorna um true que me permite criar um novo jogador:  Jogador jogador = new Jogador
      o Apos criado o jogador, chamo o metodo titularesReservas.contrataJogador(jogador);
      o o metodo contrataJogador insere o objeto jogador num ArrayList listaDeJogadores.add(jogador);

Esta inserido assim o meu jogador de forma manual.
Eh possivel ver o jogador inserido na tabela gerada quando pressiono o botao inferior direito demitirJogadorJB ( X demitir). O mesmo aciona TtlRsvTelaPrincipal.demitirJogadorNoElenco

Tentando aproveitar esse processo, para inserir no ArrayList listaDeJogadores os 22 jogadores via um arquivo TXT.

Ai entra a classe ImportaTXT.java:

* Clicando no botao lerJogadorTxtJB, aciono o metodo importaTXT.lerArquivo:
      o o mesmo usa JFileChooser, apos selecionar o arquivo jogadores.txt:
      o seleciona as linhas para inserir os jogadores : FileReader ler = new FileReader(nomeArquivo);
      o pego a linha atual e a envio para o metodo ImportaTXT.insereJgdrDoTxtParaArrayList(linha);
      o o metodo insereJgdrDoTxtParaArrayList usa o split para separar os dados da linha;
      o apos o split coloco cada valor dentro das variaveis com as informacoes dos jogadores;
      o instancio um painel  e envio os valores para cada campo : IncluiJogadorPainel incluiRJogadorPainel = new IncluiJogadorPainel();
      o mando validar os valores :  incluiRJogadorPainel.validarDadosInseridosPeloTreinador();
      o retornando um true chamo o metodo titularesReservas.contrataJogadorTXT(jogador);
      o no metodo insere  no Arraylist listaDeJogadores.add(jogador);

Essa seria a logica de funcionamento. Ao executar o debug do Eclipse:

  1. Vou criar um jogador de forma manual : botao contratarJogadorJB - efetuado com sucesso
  2. Clico em “X demitir” (demitirJogadorJB) para ver meu jogador criado - o jogador esta ali
  3. Clicando em TXT (lerJogadorTxtJB):
    1. importaTXT.lerArquivo(); OK
    2. via JFileChooser abro o jogadores.txt; OK
    3. Pego linha a linha pelo : BufferedReader leitor = new BufferedReader(ler); OK
    4. envio a linha para o metodo :insereJgdrDoTxtParaArrayList(linha); OK
    5. jogando a linha para as variaveis ; OK
    6. instanciando paniel : IncluiJogadorPainel incluiRJogadorPainel = new IncluiJogadorPainel(); OK
    7. setando valores do jogador : incluiRJogadorPainel.mtdSetaNomeJgdr(nomeJg);
      (…)
      incluiRJogadorPainel.mtdSetaIndiceTtlrddJgdr(idcTtlr); OK
    8. validando os valores : incluiRJogadorPainel.validarDadosInseridosPeloTreinador ; ok
    9. criando o objeto jogador : Jogador jogador = new Jogador ( ; OK
    10. enviando o objeto jogador para o metodo : titularesReservas.contrataJogadorTXT(jogador); ERRO :
java.lang.NullPointerException

at controle10.ImportaTXT.insereJgdrDoTxtParaArrayList(ImportaTXT.java:132)

at controle10.ImportaTXT.lerArquivo(ImportaTXT.java:71)

at grafico10.TtlRsvTelaPrincipal.actionPerformed(TtlRsvTelaPrincipal.java:247)
  • Mostrar texto das mensagens anteriores -

    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)
    

Assim termina meu debug, espero que tenha conseguido explicar o problema.

TheKill

o que tem nas linhas:

at controle10.ImportaTXT.insereJgdrDoTxtParaArrayList(ImportaTXT.java:132)
at controle10.ImportaTXT.lerArquivo(ImportaTXT.java:71)
at grafico10.TtlRsvTelaPrincipal.actionPerformed(TtlRsvTelaPrincipal.java:247)

Ele não ta conseguindo ler do Txt…
Faz o seguinte, crie 2 txt iguais… e use 1 para a parte de cadastro
e outro para a parte de demissão

P

Olá pessoal, nao sei se deveria postar esta duvida aki, mas lá vai. Sou iniciante em Java e estou desenvolvendo um aplicativo que lê arquivos texto e extrai alguns dados. O problema é que tenho que ler vários arquivos e todos estao na codificacao ANSI, assim palavras com acento nao sao reconhecidas, por exemplo, pego uma linha e a salvo numa string, depois vejo se nesta string tem alguma informacao que quero e salvo parte desta string. Assim, consigo encontrar os dados caso mude a configuracao do arquivo de ANSI para UTF-8. Pergunta: tem como eu mudar a codificacao do arquivo de forma automatizada, para que nao seja necessario alterar manualmente, já que sao varios.

Criado 13 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 9
Participantes 4