Java.lang.NullPointerException ao acessar um componente

7 respostas
L

E ai Galera,

Estou com uma dúvida…estou desenvolvendo uma aplicação com o eclipse, tenho uma classe Principal que é a interface da aplicação e estou querendo acessar um método atualize() de outra classe chamada DeletaFiles.

O trecho da Principal:

public static void atualize(){
			 	    
		    File diretorio = new File(System.getenv("systemroot")+"\\system32\\spool\\printers\\"); 
	        File[]  arquivos = diretorio.listFiles(); 
			int aux = 0;
	        String output1 = "";
			if(arquivos != null){ 
				System.out.println("Verificando se há arquivos\n");
				int length = arquivos.length;
				output1 += "Arquivos: \n";
				for(int i = 0; i < length; ++i){ 
					File f = arquivos[i];
					if(f.isFile()){ 
		              output1 += f.getName()+"\n";
		              aux++;
			        }
			   }   
				System.out.println("Tentando jogar no JTextPane\n");
				Principal vai = new Principal();
				
				vai.jTextArea.setText(output1);
			
			
             if(aux>=1){
              
            	vai.jTextField.setText("Há pelo menos " + aux/2 + " arquivos presos na fila de impressão");
                vai.jButton1.setEnabled(true);
                vai.jMenuItem1.setEnabled(true);
              
             }
             else if(aux==0){
               	 
             	vai.jTextField.setText("Não há arquivos presos na fila de impressão");
             	vai.jButton1.setEnabled(false);
             	vai.jMenuItem1.setEnabled(false);
              
             }
			
		}
	}

Na Classe DeletaFiles eu chamo o método da seguinte forma:

Principal.atualize();

e ao rodar aparece o seguinte erro:

Exception in thread “Timer-0” java.lang.NullPointerException

at Fila.Principal.atualize(Principal.java:591)

at Fila.DeletaFiles$RemindTask.run(DeletaFiles.java:87)

at java.util.TimerThread.mainLoop(Unknown Source)

at java.util.TimerThread.run(Unknown Source)

se eu tirar o tratamento de exceção.

A linha 591 é exatamente esta:

vai.jTextArea.setText(output1);

Como eu deveria proceder neste caso?

Desde já Agradeço.

7 Respostas

L

Dentro do método que você apresentou você cria uma instância de Principal e parece querer acessar esta mesma instância fora, no local onde ocorre a exceção. Como o erro só pode ser por causa que a referencia “vai” (do tipo “Principal”) está como null, então provavelmente você tem que compartilhar a instancia criada dentro do método. Sacou?

L

rpz…Não entendi muito bem não, vc poderia dar uma sugestão em código para eu testar?

L

Se eu tirar o modificador estático do método atualize, eu teria que instânciar Principal na classe DeletaFiles:

Ex:

Principal tp = new Principal();

tp.atualize();

Dá o mesmo erro.

Eu realmente não sei mais o que fazer!

L

Em relação ao código da linha que ocorre o erro:

Onde você instancia a variável “vai”?
Onde você instancia a variável jTextArea?

O erro que está ocorrendo é por causa que uma destas duas variáveis, se não as duas, estão nulas. Verifique com um debbug quais variáveis estão nulas, ou coloque um código do tipo:

if ( null != vai ) {
    if ( null != vai.jTextArea ) {
        vai.jTextArea.setText(output1);
    }
    else{
        System.out.println( "textArea is null" );
    }
}
else{
    System.out.println( "var is null" );
}

Se quiser verificar da mesma forma o output também… mas acho que com ele não há problema.

Só uma onservação para melhor organizar o seu código: você está acessando a jTextArea de outra classe, diferente da Principal? Se sim, não é legal declarar variáveis que fazem parte do estado de um objeto como public e acessá-las desta forma: vai.jTextArea.setText(output1);
O mais coerente seria declarar jTextArea como private e acessar via método get.
Isto acentua o encapsulamento dos dados.

lina

Oi,

Quando você executa o código: Principal vai = new Principal(); ele irá executar o construtor (sem parametrização) da classe Principal.
Dentro deste construtor você está criando á variavel jTextArea ??

Acredito que não…

Tchauzin!

L

luizlcfc,

A saída foi textArea is null

O trecho da instância JTextArea

private JTextArea getJTextArea() {
		if (jTextArea == null) {
			jTextArea = new JTextArea();
			jTextArea.setBounds(new Rectangle(17, 68, 316, 177));
			jTextArea.setEditable(false);
			jTextArea.setToolTipText("Lista de Documentos na Fila de Impressão ");
		}
		return jTextArea;
	}

Eu instâncio “vai” no próprio método atualize, como está no código do 1° post.

L

Ok. É o seguinte:

  • Você está instanciando dentro de atualize a classe Principal com o nome de “vai” e por fora deste método você tem uma outra instancia com o mesmo nome. Se você DECLARA dentro de um método uma instância de um objeto, ele somente será útil dentro deste mesmo método; porém se você declara fora do método e somente instancia dentro do método aí sim será a mesma instância. O que deve estar ocorrendo deve ser o seguinte:
Principal vai = new Princiap();
// (....)
public static void atualize(){
//(...)
Principal vai = new Principal();
//(...)
}

Unifique estas declarações para não ter mais problemas…

  • Lembra que no post anterior falei para usar o método get??? Então ao invés de acessar diretamente a variável jTextArea use o método get que você acabou de mostrar, isto forçará a instanciação da variável (provavelmente você terá que colocar o método getJTextArea como public).
Criado 27 de março de 2009
Ultima resposta 27 de mar. de 2009
Respostas 7
Participantes 3