Onde nullPointer?

22 respostas
guisantogui

private void salvaActionPerformed(java.awt.event.ActionEvent evt) { int retorno = dialogoArquivo.showSaveDialog(null); if(retorno == JFileChooser.APPROVE_OPTION) { File arquivo = dialogoArquivo.getSelectedFile(); try { FileOutputStream salvar = new FileOutputStream(arquivo); System.out.println("uhulll"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } } }

Olha a msg da excessão:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at Interface.TestaSalvaAbre.salvaActionPerformed(TestaSalvaAbre.java:94)
        at Interface.TestaSalvaAbre.access$000(TestaSalvaAbre.java:14)
        at Interface.TestaSalvaAbre$1.actionPerformed(TestaSalvaAbre.java:44)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Não sei pq ta estourando!

22 Respostas

Poneis123

Não está nesse null que vc passa na segunda linha?

int retorno = dialogoArquivo.showSaveDialog(null);

Apenas para teste coloque o valor 0 nessa variavel retorno e verifica se o erro persiste.

EDIT: Esquece… dei uma olhada na API do JFileChooser e pode ser null ali sim…

Eu rodei o seu código aqui e funcionou certinho… deve ser alguma configuração do seu projeto.
Coloquei o seu código e só adicionei a declaração JFileChooser dialogoArquivo = new JFileChooser(); para funcionar a variavel dialogoArquivo

guisantogui

Persiste, mas agora trocou de lugar ele estoura nullPointer na linha 5:

File arquivo = dialogoArquivo.getSelectedFile();
Poneis123

guisantogui:
Persiste, mas agora trocou de lugar ele estoura nullPointer na linha 5:

File arquivo = dialogoArquivo.getSelectedFile();

Então é o que o wellington disse, sua variavel dialogoArquivo está nula.

faça a seguinte declaração para que funcione certinho:

JFileChooser dialogoArquivo = new JFileChooser();
Poneis123

É pra ele declarar JFileChooser dialogoArquivo = new JFileChooser(); onde no seu código possivelmente está JFileChooser dialogoArquivo = null;

Ou então localize em que momento é passado o null para a variavel.

Não é para declarar dentro do método, se vc declarar dentro do método vai dar um erro de compilação.

guisantogui

private void salvaActionPerformed(java.awt.event.ActionEvent evt) { int retorno = dialogoArquivo.showSaveDialog(this); if(retorno == JFileChooser.APPROVE_OPTION) { File arquivo = new File(palavra.getText()+".txt"); arquivo = dialogoArquivo.getSelectedFile(); try { FileOutputStream salvar = new FileOutputStream(arquivo); System.out.println("uhulll"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } } }

gente consegui salvar assim, mas pq meu arquivo estava em branco qdo abri?
:frowning:

Poneis123

Ta em branco pq é o que tá no seu código, vc pede pra ele criar um arquivo com base no nome que o usuário digita e salva esse arquivo…

int retorno = dialogoArquivo.showSaveDialog(null); if(retorno == JFileChooser.APPROVE_OPTION) { File arquivo = new File(""); //Aqui vc cria a instancia de arquivo arquivo = dialogoArquivo.getSelectedFile(); //aqui vc passa o caminho que o usuario selecionou com o nome do arquivo que o usuario digitou try { FileOutputStream salvar = new FileOutputStream(arquivo); //Aqui vc salva o arquivo que o usuario digitou(arquivo novo) sem qualquer alteração System.out.println("uhulll"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } }
O q vc ta querendo fazer? o que vc queria q tivesse dentro do arquivo?

guisantogui

Como assim arquivo sendo fechado, criado ele esta sendo pq apareceu lah no desktop que eu direcionei, mas tava em branco.
Queria salvar um arquivo com os dados de uma lista ao inves de um txt, mas primeiro acho q devo saber como escrever algo no txt, depois esse “fechar” que não conheço!

Sabem o q devo fazer, vou ficar testando ake!

brigado pela força!

Poneis123

Então, qdo passa pelo código arquivo = dialogoArquivo.getSelectedFile(); ele guarda o caminho e o nome do arquivo, mais nada… é um arquivo vazio…
vc precisa gravar dentro dele o que deseja e dps utilizar o código FileOutputStream salvar = new FileOutputStream(arquivo);

tem bastante tópicos aqui no guj sobre gravação em arquivos… e tem tb esse artigo: http://www.guj.com.br/article.show.logic?id=13

Qualquer coisa grita ae.

guisantogui

Vou dar uma olhada, mas eu faria igual se quisesse salvar uma lista, ou seja arquivo binario e naum de txt?

ViniGodoy

Quando for postar uma exception, lembre-se de destacar para nós a linha que a exception indica. Por exemplo, naquele método ali, qual é a linha 94? Lembre-se que não temos um editor de textos e seu código aqui.

Outra coisa, aprenda a usar um depurador. Ele é a forma mais fácil de achar esse tipo de problema, em uns 90% dos casos. Os outros 10% são os casos em que vc bate o olho e pensa “putz, que cagad…”, e já corrige na hora.

guisantogui

Ok Vini

mas é que to meio perdidão! :S

private void salvaActionPerformed(java.awt.event.ActionEvent evt) {                                      
        int retorno = dialogoArquivo.showSaveDialog(this);
        if(retorno == JFileChooser.APPROVE_OPTION)
        {
            File arquivo = new File(palavra.getText());
            arquivo = dialogoArquivo.getSelectedFile();
            try {
                FileOutputStream salvar = new FileOutputStream(arquivo +".txt");
                FileWriter escritor = new FileWriter(arquivo);
                escritor.write("\n"+palavra.getText() + "\n"+ texto.getText() + "\n" + teste.getText());
                System.out.println("uhulll");
            }
            catch (FileNotFoundException ex){
                ex.printStackTrace();
                
            }
            catch (IOException ioe){
                ioe.printStackTrace();
            }
        }
    }

executei esse codigo, mas o arquivo continuou em branco, e naum achei ql componente eu mando fazer o ".close()"
vlw!

guisantogui
wellington.nogueira:
private void salvaActionPerformed(java.awt.event.ActionEvent evt) {                                      
        int retorno = dialogoArquivo.showSaveDialog(this);
        if(retorno == JFileChooser.APPROVE_OPTION)
        {
            File arquivo = new File(palavra.getText());
            arquivo = dialogoArquivo.getSelectedFile();
            FileOutputStream salvar = null;
            try {
                salvar = new FileOutputStream(arquivo +".txt");
                FileWriter escritor = new FileWriter(arquivo);
                escritor.write("\n"+palavra.getText() + "\n"+ texto.getText() + "\n" + teste.getText());
                System.out.println("uhulll");
            }
            catch (FileNotFoundException ex){
                ex.printStackTrace();
                
            }
            catch (IOException ioe){
                ioe.printStackTrace();
            }
            finally {
                try {
                    salvar.close();
                }
                catch(Exception e){
                    //TODO algo aqui...
                }
            }
        }
    }
Observar linha 7 e de 21 a 28

Fiz como esta aki mas não apareceu nada no meu arquivo e ele tb naum ficou com o ".txt" automaticamente :(

Poneis123

ele ta salvando como .txt pq está no código: salvar = new FileOutputStream(arquivo +".txt");

Cara, vc precisa entender como funciona a manipulação de arquivos, naquele artigo q te passei explica…

guisantogui
private void salvaActionPerformed(java.awt.event.ActionEvent evt) {                                      
        FileWriter escritor = null;
        FileOutputStream salvar = null;

        int retorno = dialogoArquivo.showSaveDialog(this);
        if(retorno == JFileChooser.APPROVE_OPTION)
        {
            File arquivo = new File(palavra.getText());
            arquivo = dialogoArquivo.getSelectedFile();
            try {
                salvar = new FileOutputStream(arquivo +".txt");
                escritor = new FileWriter(arquivo);
                escritor.write("\n"+palavra.getText() + "\n"+ texto.getText() + "\n" + teste.getText());
                System.out.println("uhulll");
            }
            catch (FileNotFoundException ex){
                ex.printStackTrace();
                
            }
            catch (IOException ioe){
                ioe.printStackTrace();
            }
            finally{
                if(salvar != null && escritor != null){
                    try{
                        salvar.close();
                        escritor.close();
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

Esse é meu codigo atualmente, onde esta o bug?

WellingtonRamos

Como a linha do NullPointer está diferente do bloco code, diria que:
dialogoArquivo está nulo.

Não é o null passado no método showSaveDialog pois se fosse isso, teria, ao menos, uma linha a mais no StackTrace.

WellingtonRamos

Então é certeza, dialogoArquivo está nulo.

um teste que pode fazer é (na primeira linha do método):

if(dialogoArquivo == null) throw new Exception("Está mesmo nulo!");

Se tiver a exceção com a mensagem, já era. Por algum motivo, neste momento você ainda não tem dialogArquivo instanciado.

PS: Pode trocar por um mero System.err.println(“Está mesmo nulo!”);

WellingtonRamos

[quote=Poneis123]

guisantogui:
Persiste, mas agora trocou de lugar ele estoura nullPointer na linha 5:

File arquivo = dialogoArquivo.getSelectedFile();

Então é o que o wellington disse, sua variavel dialogoArquivo está nula.

faça a seguinte declaração para que funcione certinho:

Eis a questão, muitas vezes, fazer isso pode não resolver. Esse é, ou um atributo de classe, ou um atributo estático. Em quaisquer desses casos, pode ser que instanciar o objeto dentro do método não resolva ou crie uma situação instável.
O ideal é instanciar no construtor (caso seja atributo de classe) ou num bloco estático (caso seja um atributo estático).

WellingtonRamos

guisantogui:
private void salvaActionPerformed(java.awt.event.ActionEvent evt) { int retorno = dialogoArquivo.showSaveDialog(this); if(retorno == JFileChooser.APPROVE_OPTION) { File arquivo = new File(palavra.getText()+".txt"); arquivo = dialogoArquivo.getSelectedFile(); try { FileOutputStream salvar = new FileOutputStream(arquivo); System.out.println("uhulll"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } } }

gente consegui salvar assim, mas pq meu arquivo estava em branco qdo abri?
:(


Ou o arquivo não existia (e acabou de ser criado), ou o arquivo estava vazio. No código que você colou aqui, não há nenhum dado sendo gravado no arquivo.
Aliás, o arquivo também não está sendo fechado.

WellingtonRamos

guisantogui:
Como assim arquivo sendo fechado, criado ele esta sendo pq apareceu lah no desktop que eu direcionei, mas tava em branco.
Queria salvar um arquivo com os dados de uma lista ao inves de um txt, mas primeiro acho q devo saber como escrever algo no txt, depois esse “fechar” que não conheço!

Sabem o q devo fazer, vou ficar testando ake!

brigado pela força!


Hmm.
O salvar deve ter um método write (se não me engano). Observe o parâmetro do mesmo.

Ao terminar, preferencialmente num bloco finally (pois você colocou um bloco try-catch) use salvar.close()
Obs.: A declaração da variável salvar será feita fora do bloco try (mas pode deixar igual a null).

Faça uma pesquisa, como o Poneis123 disse, no GUJ q tem bastante assunto.

WellingtonRamos
private void salvaActionPerformed(java.awt.event.ActionEvent evt) {                                      
        int retorno = dialogoArquivo.showSaveDialog(this);
        if(retorno == JFileChooser.APPROVE_OPTION)
        {
            File arquivo = new File(palavra.getText());
            arquivo = dialogoArquivo.getSelectedFile();
            FileOutputStream salvar = null;
            try {
                salvar = new FileOutputStream(arquivo +".txt");
                FileWriter escritor = new FileWriter(arquivo);
                escritor.write("\n"+palavra.getText() + "\n"+ texto.getText() + "\n" + teste.getText());
                System.out.println("uhulll");
            }
            catch (FileNotFoundException ex){
                ex.printStackTrace();
                
            }
            catch (IOException ioe){
                ioe.printStackTrace();
            }
            finally {
                try {
                    salvar.close();
                }
                catch(Exception e){
                    //TODO algo aqui...
                }
            }
        }
    }
Observar linha 7 e de 21 a 28
WellingtonRamos

Não tinha visto q vc pos um FileWriter no código…

adicione FileWriter escritor = null; fora do try,
troque FileWriter escritor = new… por escritor = new…
adicione também escritor.close() no bloco try dentro do bloco finally.

É melhor se acalmar, pegar exemplos que funcionam e tutoriais antes de prosseguir. Senão, vc começa a bater cabeça e vai acabar sem sair do lugar…

WellingtonRamos

Talvez e acho bem provavel, que seja o descritor de arquivos (File) ligado a um OutputStream e a um Writer.
Segue um teste rápido para gravar dados em arquivo.

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;


public class Teste {
	
	public Teste() {
		File f1 = new File("Teste.txt");
		comFileWriter(f1);
		File f2 = new File("Teste2.txt");
		comFileOutputStream(f2);
	}

	private void comFileOutputStream(File f) {
		FileOutputStream output = null;
		try {
			output = new FileOutputStream(f);
			String string = "Escrevendo uma string";
			char[] strArray = string.toCharArray();
			for (int i = 0; i < strArray.length; i++) {
				output.write(strArray[i]);
			}
		} catch (IOException ioex) {
			ioex.printStackTrace();
		} finally {
			try {
				output.close();
			} catch (IOException ioex) {
				ioex.printStackTrace();
			}
		}
	}

	private void comFileWriter(File f) {
		FileWriter writer = null;
		try {
			writer = new FileWriter(f);
			writer.write("Escrevendo uma string");
		} catch (IOException ioex) {
			ioex.printStackTrace();
		} finally {
			try {
				writer.close();
			} catch (IOException ioex) {
				ioex.printStackTrace();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Teste();
		System.exit(0);
	}

}

Aqui funcionou este Teste.

Criado 6 de abril de 2010
Ultima resposta 6 de abr. de 2010
Respostas 22
Participantes 4