Duvida Exercicio da Apostila

4 respostas
Umbriel

O Exercicio é o seguinte
Crie uma casa, pinte ela. Crie três portas e coloque-as na casa através do
método adicionaPorta, abra e feche as mesmas como desejar. Utilize o método
quantasPortasEstaoAbertas para imprimir o número de portas abertas e o método
totalDePortas para imprimir o total de portas em sua casa.

Onde estou com dificuldade
A dificuldade geral eu acho que esta sendo absorver o conceito de OO, principalmente com as matrizes que guardam referencia a um objeto.
Esse codigo esta meio porco, tem algumas coisas inuteis ali, mas postei mesmo assim pois encontrei uma barreira, que é o metodo addPorta()
Uma correcao e algumas dicas de como entender melhor sao extremamente bem vindas =)

Erro que recebo ao executar

Exception in thread main java.lang.NullPointerException

at Casa.addPorta( ExCasa.java:38 )

at ExCasa.main( ExCasa.java:57 )
class Porta {
	boolean aberta;
	
	void fechaPorta() {
		this.aberta = false;
	}
	
	void abrePorta() {
		this.aberta = true;
	}
}

class Casa {
	String cor;
	int numeroDePortas;
	Porta qntPortas[] = new Porta[10];
	
	void setColor(String c) {
		this.cor = c;
	}
	
	void setPortas(int p) {
		this.numeroDePortas = p;
	}
	
	int portasAbertas() {
		int pa=0;
		for(int i=0; i<this.qntPortas.length; i++) {
			if(this.qntPortas[i].aberta==true) {
				pa = pa+1;
			}
		}
		return pa;
	}
	
	void addPorta(Porta p) {
		for(int i=0; i<this.qntPortas.length; i++) {
			if(this.qntPortas[i].aberta==false) {
				this.qntPortas[i] = new Porta();
				this.qntPortas[i].aberta = true;
				break;
			}
		}
	}
}	

class ExCasa {
	public static void main(String[] args) {
		Casa c1 = new Casa();
		c1.setColor("Verde");
		c1.setPortas(3);
		System.out.println("Cor: "+c1.cor);
		System.out.println("Portas: "+c1.numeroDePortas);
		
		Porta p1 = new Porta();
		p1.abrePorta();
		c1.addPorta(p1);
		
		Porta p2 = new Porta();
		p1.abrePorta();
		c1.addPorta(p2);
		
		Porta p3 = new Porta();
		p1.abrePorta();
		c1.addPorta(p3);
		
		System.out.println("Abertas: "+c1.portasAbertas());
	}
}

4 Respostas

ViniGodoy

Seu for não deveria ser com i < numeroDePortas?

Umbriel

Não até porque a variavel numeroDePortas não vai enfluenciar na quantidade de portas que o método addPort() ira criar, eu fiz ela só por conta do exercicio que pedia mesmo, nao estou usando ela pra me dizer quantas portas vao dentro da array.
Pelo que parece, minha array que deveria armazenar a referencia pros objetos Porta, esta vazia.

O enunciado do exercicio completo é este, se isso ajudar a decifrar hehehe

Classe: Casa Atributos: cor, totalDePortas, portas[] Métodos: void pinta(String s), int quantasPortasEs-taoAbertas(), void adicionaPorta(Porta p), int totalDePortas()
Crie uma casa, pinte-a. Crie três portas e coloque-as na casa através do método adicionaPorta, abra
e feche-as como desejar. Utilize o método quantasPortasEstaoAbertas para imprimir o número de portas
abertas e o método totalDePortas para imprimir o total de portas em sua casa

E

Umbriel, aqui está minha contribuição!

void addPorta(Porta p) {  
        for(int i=0; i<this.qntPortas.length; i++) {  //Lembrando que sempre a iteração irá até o fim. Pois a array qntPorta tem 10 elementos.
         
            if(this.qntPortas[i].aberta==false) {  //O erro está aqui, pois no elemento 0 da array não  objeto. Não foi adicionado portas ainda. Você está dizendo o seguinte: "Será que no elemento 0 da array de Portas eu tenho uma porta fechada?" Mas como eu posso saber se a porta está fechada, se nem existe porta aqui? Então ocorre o famoso "NullPointeException". Primeiro verifique se no elemento da array existe algum objeto e tudo dará certo!

                this.qntPortas[i] = new Porta();  
                this.qntPortas[i].aberta = true;
                break;  
            }  
        }  
    }

Cara eu achei o método inútil, pois você está tentando buscar todas as portas que existem e abrir todo mundo. Sem notar que pode não ter todo mundo, como foi o caso mostrado. Tente verificar se já existem todas as 10 portas, se não existir, então adiciona uma porta na última posição da array de portas.

Espero que tenha me entendido.

Qq coisa é só responder.

Umbriel

Tem razão, eu nao tinha percebido que estava abrindo todas as portas. Acho que vou buscar mais alguns exercicios sobre Arrays e tentar denovo. Talvez entender melhor esses conceitos de OO que ainda me emabananam um pouco.

De qualquer forma, muito obrigado! eu iria demorar pra enxergar que estava abrindo todas as portas hehehehe

Um ultimo pedido, se nao for abusar demais. Que literatura adicional voce me recomenda pra complementar a apostila da Caelum?
Tenho aqui o Use a Cabeça! Java, mas acho a curva de ensino dele meio inclinada.

Um abraço e obrigado novamente!

Criado 2 de fevereiro de 2012
Ultima resposta 3 de fev. de 2012
Respostas 4
Participantes 3