Não consegui achar o erro!

3 respostas
J
Alguem porderia me dizer onde estar o erro desse aplicativo: Aqui estão as 3 classes:
public class Casa1 {
	
	String cor = "";
	int totalDePortas = 0;
	Porta porta[];
	
	
	void pinta(String s){
		cor = s;
	}
	int cont = 0;
	int quantasPortasEstaoAbertas(){
		for(int x=0; x<porta.length; x++){
			if(porta[x].aberta == true){
				cont++;
			}
			else{
				return cont;
			}
		}
		return cont;
	}
	void adicionaPorta(Porta p){
		p = new Porta();
	}
	int totalDePortas(){
		for(int x=0; x<porta.length; x++){
			if(porta[x] != null){
			 	totalDePortas += 1;
			}
			else{
		    	return totalDePortas;
		    }
		}
		return totalDePortas;
	}

	
}
public class Porta {
	boolean aberta = false;
}
public class Casa1Test {
	
	public static void main(String[] args){
		
		Casa1 c1 = new Casa1();
		c1.pinta("Azul");
		c1.porta = new Porta[3];
		c1.adicionaPorta(c1.porta[0]);
		c1.adicionaPorta(c1.porta[1]);
		c1.adicionaPorta(c1.porta[2]);
		c1.porta[0].aberta = true;
		c1.porta[1].aberta = false;
		c1.porta[2].aberta = true;
		
		System.out.println("Exitem quantas portas na casa?  " + c1.totalDePortas());
		System.out.println("Quantas portas estão abertas?  " + c1.quantasPortasEstaoAbertas());
		
	}
}

Aparece esse na execução:
Exception in thread "main" java.lang.NullPointerException
at Casa1Test.main(Casa1Test.java:11)

A linha 11 é esta: c1.porta[0].aberta = true;

3 Respostas

I

Basicamente vc cria um espaco em memoria,joga fora e tenta acessar o nada.

Quando vc chega em c1.adicionaPorta(c1.porta[0]); vc aloca um espaço na memória,que funciona,mas somente na função e quando vc sai dela o negócio é ‘jogado fora’.

Quando vc acessa o array pra alterar os valores,porta[x] está como null (endereço inválido,fora dos limites,etc).Por isso NullPointerException: vc não tem uma classe ‘alocada’ pra acessar.

Tenta essas duas variantes, e acompanhe pelo debug do eclipse,comparando com o teu codigo original:

void adicionaPorta() { for (int i=0;i<3;i++) { porta[i] = new Porta(); } }

c1.adicionaPorta();


void adicionaPorta(int i){
	porta[i] = new Porta();
}

c1.adicionaPorta(0); c1.adicionaPorta(1); c1.adicionaPorta(2);

J

Mas na questão é pedido que se coloque um método
" void adicionaPorta(Porta p) " com um arg do tipo Porta.

J

Fiz essas modificações:

public class Casa1Test {
	
	public static void main(String[] args){
		
		Casa1 c1 = new Casa1();
		c1.pinta("Azul");
		System.out.println("Cor da casa: " + c1.cor);
		c1.porta = new Porta[3];
		
		for(int i=0; i<3; i++){
			c1.porta[i] = new Porta();
			c1.adicionaPorta(c1.porta[i]);
		}
		System.out.println("Exitem quantas portas na casa?  " + c1.totalDePortas());
		c1.porta[0].aberta = false;
		c1.porta[1].aberta = true;
		c1.porta[2].aberta = false;
		System.out.println("Quantas portas estão abertas?  " + c1.quantasPortasEstaoAbertas());
		
	}
}
public class Casa1 {
	
	String cor = "";
	int totalDePortas = 0;
	Porta porta[];
	
	
	void pinta(String s){
		cor = s;
	}
	int cont = 0;
	int quantasPortasEstaoAbertas(){
		for(int x=0; x<porta.length; x++){
			if(porta[x].aberta == true){
				cont = cont + 1;
			}
			else{
				cont = cont;
			}
		}
		return cont;
	}
	void adicionaPorta(Porta p){
		if(p != null){
			totalDePortas += 1;
		}
    }
	int totalDePortas(){
		return this.totalDePortas;
	}

	
}
public class Porta {
	boolean aberta = false;
}

Será que está certo agora?

Criado 28 de abril de 2007
Ultima resposta 29 de abr. de 2007
Respostas 3
Participantes 2