Naum consigo inicializar a variavel

29 respostas
R

Pessoal, to com problema ao tentar inicializar algumas variaveis. Gera um erro de “java.lang.NullPointerException”. Eu achava que estava feito corretamente, mas o java me mostrou mais uma vez que eu estava errado, i o pior to levando uma surra, pois naum consigo resolver um problema aparentemente fácil. Espero que exista uma alma salvadora
Esses metodos get’s e set’s to fazendo para pegar o que foi digitado na tela.

public String getClientes(){
		return txtCliente.getText();
	}
	public String getFabricantes (){
		return txtFabricante.getText();
	}
	public String getProdutos (){
		return txtProduto.getText();
	}

E aqui tento inicializar minhas variaveis em outra classe com o que foi digitado na tela, a Stack me joga na cara que o erro esta na variavel cliente, fabricante, produto.

public void geraClasseBanco(){
		try{
			 cliente = pag.getClientes();
			 fabricante = pag.getFabricantes();
			 produto = pag.getProdutos();
			
			File arquivo = new File("C:/FDDK/runtime-EclipseApplication/Extrator/src/" + cliente  + '/' + 
					fabricante + '/' + produto +  '/'+ "shared.dbs" );		
			arquivo.mkdirs();
			
			File arqui = new File("C:/FDDK/runtime-EclipseApplication/Extrator/src/" + cliente  + '/' + 
					'/' + 	fabricante + '/' + produto +  '/' + "shared.dbs" + '/' + banco + ".java"); 	
			if (!arqui.exists())
				arqui.createNewFile();	
			writer = new PrintWriter(new FileWriter(arqui));
			escreverMetodosBancos(null);	
		}catch (Exception e) {
			e.printStackTrace();

29 Respostas

K

ja testou colocar as variaveis como static?
se as funcoes estiverem em outro form da esse problema mesmo.

olha ai depois responde

thiago.correa

Cara, debugue o teu código, você pode estar usando um objeto que na verdade está nulo como por exemplo o objeto txtCliente, ou txtFavricante ou txtProduto, sem a stack trace fica difícil de saber.

R

Naum sei dizer se isso é um bom ou mal, pq agora naum gera erro nenhum, mas também não faz nada!!!

R

Pois éh, ja fiz uns testes aqui, realmente a variavel naum consegue inicializar, ela tah vazia, mas isso eu ja sabia. eu quero saber como faço para inicializar ela, por que meus conhecimentos acabaram por aqui e naum sei mais o que fazer, qualquer dica de como fazer sera bem apreciada.

R

acho que não foi apenas o meu conhecimento que acabou.

kinow

O problema persiste? Você não pode colar a mensagem de erro (stack trace inteiro) aqui?

Poste mais do código, ou anexe à mensagem o código se for muito longo.

[]sssssssssss

R

O erro acontece, quando eu tento iniciar a variavel , com que vem da outra tela.

java.lang.NullPointerException
	at freedecision.wizard.GerarPacotes.geraClasseBanco(GerarPacotes.java:235)
	at freedecision.wizard.FreeDecisionWizardPage3$1.handleEvent(FreeDecisionWizardPage3.java:239)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
cliente nulo
fabricante nulo
produto nulo
public void geraClasseBanco(){
		try{
			 cliente = pag.getCli(); ---- bem aki acontece o erro------ tentei pegar o que foi digitado na outra tela.
			 fabricante = pag.getFab();
			 produto = pag.getPro();
R

E o erro continua… :thumbdown:

fantomas

Para dar null pointer exception nesta linha a variável pag deve estar NULA, já verificou se ela está inicilizada quando a jvm chega neste ponto?

flws

R

Bein… a variavel pag representa uma classe que contem os txts que preciso pegar, mas pra dar esse acredito que ela naum esta sendo inicilizada, mas como eu inicializo esse tipo de variavel? Se precisar eu posto todo o meu codigo.

fantomas

Post só a classe que possui o método (geraClasseBanco) onde ocorre o erro.

flws

R

Esta é a classe que contem os metodos

private String cliente;
private String fabricante;
private String produto
private String banco;
private FreeDecisionWizardPage2 pag; 
      
public void geraClasseBanco(){
		try{
			 cliente = pag.getCli(); ----- inicializando as variaveis 
			 fabricante = pag.getFab();
			 produto = pag.getPro();
			
			File arquivo = new File("C:/FDDK/runtime-EclipseApplication/Extrator/src/" + cliente  + '/' + 
					fabricante + '/' + produto +  '/'+ "shared.dbs" );		
			arquivo.mkdirs();
			
		   File arqui = new File("C:/FDDK/runtime-EclipseApplication/Extrator/src/" + cliente  + '/' + 
					'/' + 	fabricante + '/' + produto +  '/' + "shared.dbs" + '/' + banco + ".java"); 	
			if (!arqui.exists())
				arqui.createNewFile();	
			writer = new PrintWriter(new FileWriter(arqui));
			escreverMetodosBancos(null);	
		}catch (Exception e) {
			e.printStackTrace();
			
			if(cliente == null){  
			       System.out.println("cliente nulo");  
			    }  
		    if(fabricante == null){  
			       System.out.println("fabricante nulo");  
			    }  
		    if(produto == null){  
			       System.out.println("produto nulo");  
			    }  
		}
	}
	
}

public void setCliente(String cliente) {
		this.cliente = cliente;
	}

	public String getCliente() {
		return cliente;
	}

public void setFabricante(String fabricante) {
		this.fabricante = fabricante;
	}
public String getFabricante() {
		return fabricante;
	}

	public String getProduto() {
		return produto;
	}

	public void setProduto(String produto) {
		this.produto = produto;
	}
fantomas

Então raphaelFree, a solução esta relacionada com a maneira como o seus objetos estão associados. Observando esta classe que vc postou dá a impressão que vc gerou uma instancia de FreeDecisionWizardPage2 em uma outra classe e está tentando utilizar esta instancia dentro do método geraClasseBanco().

Caso afirmativo uma opção é a seguinte:

FreeDecisionWizardPage2 pag = new FreeDecisionWizardPage2() // SUPOSTAS inicialização do objeto pag ... // Após a digitação dos dados nos JTextField .. objeto_da_classe_que_vc_postou.geraClasseBanco(pag); ...

Como vc pode observar eu estou passando pag como parametro para geraClasseBanco(), logo temos que fazer um ajuste no método:

public void geraClasseBanco(FreeDecisionWizardPage2 pag){  // <-------<< Alterei aqui
         try{  
              cliente = pag.getCli(); ----- inicializando as variaveis   
              fabricante = pag.getFab();  
              produto = pag.getPro();  
               
             File arquivo = new File("C:/FDDK/runtime-EclipseApplication/Extrator/src/" + cliente  + '/' +   
                     fabricante + '/' + produto +  '/'+ "shared.dbs" );        
             arquivo.mkdirs();  
               
            File arqui = new File("C:/FDDK/runtime-EclipseApplication/Extrator/src/" + cliente  + '/' +   
                     '/' +   fabricante + '/' + produto +  '/' + "shared.dbs" + '/' + banco + ".java");    
             if (!arqui.exists())  
                 arqui.createNewFile();    
             writer = new PrintWriter(new FileWriter(arqui));  
             escreverMetodosBancos(null);      
         }catch (Exception e) {  
             e.printStackTrace();  
               
             if(cliente == null){    
                    System.out.println("cliente nulo");    
                 }    
             if(fabricante == null){    
                    System.out.println("fabricante nulo");    
                 }    
             if(produto == null){    
                    System.out.println("produto nulo");    
                 }    
         }  
     }  
       
 }

Outro saida:

FreeDecisionWizardPage2 pag = new FreeDecisionWizardPage2() // SUPOSTAS inicialização do objeto pag ... // Após a digitação dos dados nos JTextField .. Classe_Que_Voce_Postou objeto = new Classe_Que_Voce_Postou(pag); ... objeto_da_classe_que_vc_postou.geraClasseBanco(); ...

Note que passe o objeto pag como parametro para o construtor, então temos que montar um construtor adequado:

public Classe_Que_Voce_Postou(FreeDecisionWizardPage2 pag) { this.pag = pag; }

Deste jeito não precisa alterar o método geraClasseBanco()

Espero ter ajudado.

flws

R
Entaum fantomas... vc esta me ajudando bastante, e eu sei que estou ocupando bastante o tempo seu,porém eu alterei o metodo passando o parametro e continuou da mesma forma, mas acredito ter feito de forma errada . Eu chamei o metodo desta forma. Ficou assim. O erro, contudo, continuou o mesmo
FreeDecisionWizardPage2 pagina = new FreeDecisionWizardPage2 ();// pagina que contem os txt's preciso pegar
					
				GerarPacotes gera = new GerarPacotes();// classe que contem o metodo
				
				gera.setCliente(pagina.getCliente());// pegando txt's da outra classe
				gera.setFabricante(pagina.getFabricante());
				gera.setProduto(pagina.getProduto());
				
				gera.setBanco(txtBanco.getText());// pegando o txt [b]desta[/b] classe
				
				gera.geraClasseBanco(pagina);// chamando o metodo
				gera.criarReadersPag3(pagina)// chamando o metodo
Focao
fantomas

Envia a stack trace do erro novamente pra eu dar uma olhada.

flws

R

A stack tah ai. Pelo erro ele continua sem conseguir iniciar as variaveis

java.lang.NullPointerException
	at freedecision.wizard.FreeDecisionWizardPage2.getCli(FreeDecisionWizardPage2.java:249)
	at freedecision.wizard.GerarPacotes.geraClasseBanco(GerarPacotes.java:235)
	at freedecision.wizard.FreeDecisionWizardPage3$1.handleEvent(FreeDecisionWizardPage3.java:241)
cliente nulo
fabricante nulo
produto nulo
R

Focão:
raphaelFree:

FreeDecisionWizardPage2 pagina = new FreeDecisionWizardPage2 ();// pagina que contem os txt's preciso pegar
					
GerarPacotes gera = new GerarPacotes();// classe que contem o metodo
				
gera.setCliente(pagina.getCliente());// pegando txt's da outra classe
gera.setFabricante(pagina.getFabricante());
gera.setProduto(pagina.getProduto());
gera.setBanco(txtBanco.getText());// pegando o txt [b]desta[/b] classe
gera.geraClasseBanco(pagina);// chamando o metodo
gera.criarReadersPag3(pagina)// chamando o metodo

tem setar os valores em FreeDecisionWizardPage2
tipo pagina.setCliente(“cliente”)

Blz focão. Bein eu tentei algo parecido, como eu quero criar pacotes e classes, se eu setar um caminho fixo para o metodo do tipo “C:\FDDK\runtime-EclipseApplication\Extrator\src\Free\datasul”, ele consegue axar o diretorio onde ele deve criar esse pacote.(Esse caminho de diretorio foi criado na tela anterior a essa), porem se eu tentar pegar o txt’s da tela anterior e setar como caminho da essa stack.

R

Espero que eu esteja sendo claro o que eu preciso fazer. Mas mesmo assim vou tentar descrever o qual é a missão (quase impossivel).
Tenho 2as wizards, (aquelas que contem os botãos next, back, finish,cancel). Desta forma na primeria wizard eu digito algums dados , onde esses dados que eu digitei serão o nome das pastas do meu diretório. Então na segunda wizard, preciso desses dados da primeira (esses dados são o caminho dos diretórios) para mim poder criar os pacotes e classes respectivos da segunda. Meio confuso?
É que eu naum consigo explicar melhor que isso.

fantomas

Você poderia passar essa classe FreeDecisionWizardPage2.java completa?

P.S. Espero que ela esteja compativel com a ultima stack trace que vc mandou.

flws

R
E meio grandinha... mas tah , espero que vc possa se axar .. É aqui que começa o programa, digita-se os dados e pressionar gerar extrutura, então é criado alguns pacotes e classes. Então to tentando pegar o caminho desses diretorios e setar na pagina 3 para eu pode criar outros pacotes.
package freedecision.wizard;

import javax.swing.JOptionPane;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;


public class FreeDecisionWizardPage2 extends WizardPage implements Listener {
	
	private Text txtFabricante, txtArea, txtProduto, txtExtrator,txtCliente;
	private Button btnGerar;
	private ISelection selection;
	private GerarPacotes gera;
	
	private String cliente ;
	private String fabricante;
	private String produto ;
	private String areanegocio;
	private String extrator;
	
	
	public FreeDecisionWizardPage2() {
		// painel superior
		super("Definição da estrutura de pacotes e classe do JAVA para o Extrator");
		setTitle(" Passo 2 - Adicionar Dados ao Extrator");
		setDescription("Este assistente auxilia a criação da estrutura  do extrator");
		this.setSelection(selection);
		
	}
	
	public void createControl(Composite shell) {
		Composite controle = new Composite(shell, SWT.NULL);
		// layout da tela
		GridLayout layout = new GridLayout();
		controle.setLayout(layout);
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		layout.numColumns = 2;
		layout.verticalSpacing = 8;
		
		//label cliente
		Label label = new Label(controle, SWT.NULL);
		label.setText("Cliente:");
		
		// txt cliente
		txtCliente = new Text(controle, SWT.BORDER | SWT.SINGLE);
		txtCliente.setLayoutData(gd);
		txtCliente.setToolTipText("Digite o Nome do Cliente. EX:(Danica)");
		txtCliente.setText("Free");
		
		// label fabricante
		Label labelFab = new Label(controle, SWT.NULL);
		labelFab.setText("Fabricante:");
		
		//txtfabricante
		txtFabricante = new Text(controle, SWT.BORDER | SWT.SINGLE);
		txtFabricante.setLayoutData(gd);
		txtFabricante.setToolTipText("Digite o Fabricante do ERP. EX:(DATASUL)");
		txtFabricante.setText("datasul");
		
		// label produto
		Label labProd = new Label(controle, SWT.NULL);
		labProd.setText("Produto");
		
		//txtproduto
		txtProduto = new Text(controle,SWT.BORDER | SWT.SINGLE);
		txtProduto.setLayoutData(gd);
		txtProduto.setToolTipText("Digite o Nome do Produto. EX: (EMS2)");
		txtProduto.setText("ems2");
		
		// label area de negocio
		Label labelArea = new Label(controle, SWT.NULL);
		labelArea.setText("Área de Negócio:");
		Label label7 = new Label(controle, SWT.NULL);
		label7.setText("");
		txtArea = new Text(controle, SWT.BORDER | SWT.SINGLE);
		txtArea.setLayoutData(gd);
		txtArea.setText("dis");
		txtArea.setToolTipText("Digite a Área de Negócio, EX: Dis(Distribuição)");
		
		//label extrator
		Label labelExt = new Label(controle, SWT.NULL);
		labelExt.setText("Extrator:");
		
		//txt Extrator
		txtExtrator = new Text(controle, SWT.BORDER | SWT.SINGLE);
		txtExtrator.setLayoutData(gd);
		txtExtrator.setToolTipText("Digite o Nome do Extrator, EX: (Vendas) ");
		txtExtrator.setText("Vendas");
		
		btnGerar = new Button (controle, SWT.PUSH);
		btnGerar.setText("Gerar Estrutura");
		btnGerar.setToolTipText("Pressione para gerar os pacotes do Extratror");
		//btnGerar.setAlignment(160);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
		btnGerar.setLayoutData(gd);
		btnGerar.addListener(SWT.Selection, new Listener(){
		
			
			// acao do botao gerar extrutura
                       // a estrutura de diretorios que foram criados nesta classe formam
                      // o caminho para se poder gerar o pacote da pagina 3 (FreeDecisionWizardPage3)

			public  void handleEvent(Event event) {
				
				GerarPacotes gera = new GerarPacotes();
				//colocando dentro da varivel o que vem da tela
				gera.setCliente(txtCliente.getText());
				gera.setFabricante(txtFabricante.getText());
				gera.setProduto(txtProduto.getText());
				gera.setAreanegocio(txtArea.getText());
				gera.setExtrator(txtExtrator.getText());
	
				// executando os metodos da classe geraPacotes
				gera.gerarPacotesCliente();
				gera.gerarPacotesFabricante();
				//gera.gerarPacotesProdutos();
				gera.gerarPacotesAreaNegocio();
				gera.gerarPacoteslib();
				gera.criarReaders();
		
				}
			}
		}
	);
		
			setControl(controle);
		}
	
	// metodos get e set's dessa classe
	public void setSelection(ISelection selection) {
		this.selection = selection;
	}
	public ISelection getSelection() {
		return selection;
	}
	public String getCliente() {
		return cliente;
	}
	public void setCliente(String cliente) {
		this.cliente = cliente;
	}
	public String getFabricante() {
		return fabricante;
	}
	public void setFabricante(String fabricante) {
		this.fabricante = fabricante;
	}
	public String getProduto() {
		return produto;
	}
	public void setProduto(String produto) {
		this.produto = produto;
	}
	public String getAreanegocio() {
		return areanegocio;
	}
	public void setAreanegocio(String areanegocio) {
		this.areanegocio = areanegocio;
	}
	public String getExtrator() {
		return extrator;
	}
	public void setExtrator(String extrator) {
		this.extrator = extrator;
	}
	
	public void setGera(GerarPacotes gera) {
		this.gera = gera;
	}
	public GerarPacotes getGera() {
		return gera;
	}
	//---------Metodo get para pegar o txt dessa classe---------------------
	
	public String getCli(){
		return txtCliente.getText();
	}
	public String getFab (){
		return txtFabricante.getText();
	}
	public String getPro (){
		return txtProduto.getText();
	}

}
fantomas

Então…duas coisas me chamaram a atenção:

  1. O statck trace aponta para a linha 249 mas a sua classe tem apenas 196.

  2. O método createControl() possui a inicialização dos componentes visuais e NÃO VI NENHUMA chama interna para este método significa que TODA VEZ QUE VC CRIAR UMA INSTANCIA desta classe você tem que chamar este método, VERIFIQUE SE VC NÃO ESQUECEU DE EXECUTAR ESTA CHAMADA APOS A INICIALIZAÇÃO.

flws

R

Qto a linha, é que eu tentei simplicar e retirei algumas coisas sem importancia, até pq o erro acontece na mesma linha da primeira stack que eu postei e quanto a esse control , naum entendi o que vc quis dizer , como assim chamar ? :oops:

R

Os erros estao nesta linha

public String getCli(){ return txtCliente.getText();// erro aki (Classe: FreeDecisionWizardPage2) }

nesta…

public void geraClasseBanco(FreeDecisionWizardPage2 pag){
		try{
			 cliente = pag.getCli();// erro aki (Classe: GerarPacotes)
			 fabricante = pag.getFab();
			 produto = pag.getPro();

e por fim nesta…

gera.geraClasseBanco(pag); (Classe: FreeDecisionWizardPage3)
fantomas

Eu me refiro a este método aqui:

public void createControl(Composite shell) {
...
}

que está na classe FreeDecisionWizardPage2.

Se entendi bem para o objeto da sua classe funciona direito teria que ser utilizado assim:

...
FreeDecisionWizardPage2 page = new FreeDecisionWizardPage2();

Composite shell = new Composite();

page.createControl(shell);  // <-----<< Inicializa os objetos visuais da sua classe
...

Olhe dentro do método createControl(), perceba que é nele que vc inicializa os objetos visuais. Quer dizer que toda vêz que você criar um objeto da classe FreeDecisionWizardPage2 você terá que executar este método, caso contrario havera um erro ao acessar o getCli() porque o txtCliente estará vazio.

Portando verifique se após criar algum objeto da FreeDecisionWizardPage2 vc está executando este método como demonstrei acima.

flws

R

Pois éh entaum… fiz assim, foi o jeito que eu entendi e a stack continua a mesma. To cansado, de tanto procurar e naum conseguir sair do lugar.

FreeDecisionWizardPage2 pag = new FreeDecisionWizardPage2 (selection);   
				pag.getControl();

e assim:

pag.getControl();
			 cliente = pag.getCli();
			 fabricante = pag.getFab();
			 produto = pag.getPro();
R

Pois éh entaum… fiz assim, foi o jeito que eu entendi e a stack continua a mesma. To cansado, de tanto procurar e naum conseguir sair do lugar, pq ja to um tempão nesse erro maldito patinando e patinando i nada , nem o erro muda.

FreeDecisionWizardPage2 pag = new FreeDecisionWizardPage2 (selection);   
				pag.getControl();

e assim:

pag.getControl();
			 cliente = pag.getCli();
			 fabricante = pag.getFab();
			 produto = pag.getPro();
fantomas

Você escreveu [color=red]getControl()[/color] MAS EU ESTOU FALANDO DO createControl(shell); será que estamos falando da mesma coisa?

flws

R

Amigo, eu axei uma solução, não foi a melhor e nem a que eu queria, mas pelo menos da pra mostrar pro patrão o negócio rodando. Foi criado variaveis staticas e o metodo de gerar classesBancos eu coloquei dentro da frame. Dai eu testei e rodou. Muito obrigado pela ajuda, contudo consegui aprender coisas novas, como aquela do construtor e uma nova forma de instaciar as classes. Vlw, com certeza a gente vai se cruzar varias vezes neste forum, até pq tem muita coisa pra fazer ainda.

Criado 14 de novembro de 2008
Ultima resposta 18 de nov. de 2008
Respostas 29
Participantes 6