[RESOLVIDO] Commands no Alert da NullExceptionPointer

Olá galera que já me ajudou muito aqui, seja com comentários em tópicos e seja por minhas dúvidas também :smiley: estou aqui novamente.

Estou programando em J2ME em OO, bom tenho uma classe “Principal” que é o meu MIDlet fiz um classe chamada “Erros” que nela ficam os Alerts da minha aplicação em caso de um aviso ou um erro.

Todos os Alerts que não possuem comanndo estão certos, eu chamo eles, aí apaerecem na tela e depois de 4 segundos voltam pra tela que tava trabbalhando.

Porém fiz um Alert que tem 2 botões: Sim e Não! (cmdYes, cmdNo), implementei nesta classe “Erros” o CommandListner e seu método ficando assim o cógido:

[code]// DIÁLOGO
public Alert AlertDialogo(String texto) {
objAlerta = new Alert("[ AVISO ]");
objAlerta.setType(AlertType.CONFIRMATION);
objAlerta.setString(texto);
cmdYes = new Command(“Sim”, Command.OK, 0);
cmdNo = new Command(“Não”, Command.CANCEL, 0);
objAlerta.addCommand(cmdYes);
objAlerta.addCommand(cmdNo);
try {
imagem = Image.createImage("/img_alerta.png");
objAlerta.setImage(imagem);
} catch (IOException e) {
System.out.println(“Não foi possível carregar a imagem de Erro.”);
e.printStackTrace();
}
objAlerta.setCommandListener(this);
return objAlerta;
}

public void commandAction(Command c, Displayable d) {
	if(c.equals(cmdYes)){
		System.out.println("Sim");
		principal.destroyApp(true);
	} else {
		System.out.println("Não");
		principal.trocarTela(Principal.TELA_FORM_ESCOLHA_CONSULTA);
	}
	
}[/code]

Acontece que tanto o cmdYes quando o cmdNo da este erro:

[quote]Sim
java.lang.NullPointerException
at br.com.buscamobile.Erros.commandAction(+16)
at javax.microedition.lcdui.Alert$1.commandAction(+35)
at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68 )
at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47 )
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent(+186)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+57)
[/quote]

O que estou fazendo de errado? Obrigado.

Isso acontece quando você tenta acessar os membros de uma classe que não foi instanciada.

Tentou debugar o código??

[quote=altitdb]Isso acontece quando você tenta acessar os membros de uma classe que não foi instanciada.

Tentou debugar o código??[/quote]

Olá, no código que chamo ele está assim:

private Erros erros; ... public void commandAction(Command c, Displayable d) { if (c.equals(cmdSair)) { erros = new Erros(); alerta = erros.AlertDialogo(erros.ERRO_DESEJA_SAIR); Display.getDisplay(principal).setCurrent(alerta); } }

O alerta já está no tipo Alert;
O ERRO_DESEJA_SAIR é uma String com a mensagem de erro.

Qual das classes devo debugar (colocar o point break)?

Obrigado por sua resposta.

Tenta por o Point Break na assinatura dos metodos, e ve qual deles tá lançando a exceção!

Pelo que me parece o erro está nesta parte:

[code]public void commandAction(Command c, Displayable d) {
if(c.equals(cmdYes)){
System.out.println(“Sim”);
/==>/ principal.destroyApp(true);
} else {
System.out.println(“Não”);
/==>/ principal.trocarTela(Principal.TELA_FORM_ESCOLHA_CONSULTA); // Este método controla muda as telas de forms
}

 }

[/code]
Onde chega na parte das setas aí lança o Exception.

no início do “Erros” tem:

Se quiser posto o código inteiro do Erros.
Obrigado.

Posta todos os codigos ae…

Você iniciou essa variavel principal antes de setar valores nela?

voce fez isso? privte Principal principal; public Erros(){ principal=new Principal; }

[quote=AntonioDiego]voce fez isso? privte Principal principal; public Erros(){ principal=new Principal; }
[/quote]

Olá tentei isso que você disse ele dá UnautorizedAcess, bom consegui resolver o problema, não sei se foi a melhor alternativa.

Vejam só:

Na classe Erros:

public Erros(Principal principal) { this.principal = principal; }

Nas demais classes ficou assim:

erros = new Erros(principal); alerta = erros.alertDialogo(erros.ALERTA_DESEJA_SAIR); Display.getDisplay(principal).setCurrent(alerta);

E na Principal quando preciso chamar um erro faço assim:

erros = new Erros(this); alerta = erros.alertErro(erros.ERRO_PAGE_NOT_FOUND); Display.getDisplay(this).setCurrent(alerta);

Caso eu tenha feito certo serve para alguém que passar pelo mesmo problema, se foi uma má saída por favor me digam.

Obrigado a todos novamente.

Pois é, pode ter certeza q essa nao é uma ma saida ,quando respodi ai em cima nao sabia que principal era midlet, é que para instanciar uma classe midlet voce tem que passa-la como parametro e nao chamar seu construtor.

Obrigado novamente pelo comentário, não tinha certeza desta de passar o MIDlet como parâmetro agora tenho!

Obrigado.