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

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

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:

[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

Espero que essses trechos tenaham ajudado.
Obrigado

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

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

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

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.

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

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.