Resolução do exercicio 4.14 da apostila fj-11 da CAELUM

Oi boa tarde estou resolvendo esse exercicio mas está dando o erro “Exception in thread “main” java.lang.NullPointerExceptionat TestCasa.main(TestCasa.java:7)”

class Porta {
	String cor;
	boolean aberta;
	int dimensaoX;
	int dimensaoY;
	int dimensaoZ;
	
	void abre(){
		aberta = true;
	}
	void fecha(){
		aberta = false;
	}
	void pinta(String s){
		this.cor = s;
	}
	void estaAberta(){
		if(aberta == true){
			System.out.println("Está aberta!");
		}else {
			System.out.println("Está fechada!");
		}
	}
	void mostra(){
		System.out.println("A cor da porta é: "+this.cor);
		System.out.println("A dimensão X é: "+this.dimensaoX);
		System.out.println("A dimensão Y é: "+this.dimensaoY);
		System.out.println("A dimensão Z é: "+this.dimensaoZ);
	}
}
class Casa {
	String cor;
	Porta porta1;
	Porta porta2;
	Porta porta3;
	
	void pinta(String S){
		this.cor = S;
	}
	
	int quantasPortasEstaoAbertas(){
		int i = 0;
		if(porta1.aberta == true){
			i += 1;
		}if(porta2.aberta == true){
			i += 1;
		}if(porta3.aberta == true){
			i += 1;
		}
		return i;
	}
	
	void mostra(){
		System.out.println("Cor da casa: "+this.cor);
		System.out.println("Cor da porta1: "+this.porta1.cor);
		System.out.println("DimensãoX da porta1: "+this.porta1.dimensaoX);
		System.out.println("DimensãoY da porta1: "+this.porta1.dimensaoY);
		System.out.println("DimensãoZ da porta1: "+this.porta1.dimensaoZ);
		System.out.println("Cor da porta2: "+this.porta2.cor);
		System.out.println("DimensãoX da porta2: "+this.porta2.dimensaoX);
		System.out.println("DimensãoY da porta2: "+this.porta2.dimensaoY);
		System.out.println("DimensãoZ da porta2: "+this.porta2.dimensaoZ);
		System.out.println("Cor da porta3: "+this.porta3.cor);
		System.out.println("DimensãoX da porta3: "+this.porta3.dimensaoX);
		System.out.println("DimensãoY da porta3: "+this.porta3.dimensaoY);
		System.out.println("DimensãoZ da porta3: "+this.porta3.dimensaoZ);
	}
}
public class TestCasa {
	public static void main(String[] args) {
		Casa casa = new Casa();
		
		casa.cor = "Branca";
		
		casa.porta1.cor = "Verde";
		casa.porta1.dimensaoX = 10;
		casa.porta1.dimensaoY = 20;
		casa.porta1.dimensaoZ = 5;
		casa.porta1.abre();
		
		casa.porta2.cor = "Verde";
		casa.porta2.dimensaoX = 10;
		casa.porta2.dimensaoY = 20;
		casa.porta2.dimensaoZ = 5;
		casa.porta2.abre();
		
		casa.porta3.cor = "Verde";
		casa.porta3.dimensaoX = 10;
		casa.porta3.dimensaoY = 20;
		casa.porta3.dimensaoZ = 5;
		casa.porta3.abre();
		
		casa.mostra();
		casa.quantasPortasEstaoAbertas();
	}

}

Desde já agradeço!

Bom, tem alguns pontos ai…

if(aberta == true){  

1º: Quando fazemos validação com valor booleando, ele só pode ser true ou false, entao não tem necessidade de verificar se ele é true, poderia ficar apenas if (aberta) { }

2º: Procure usar atributos privados e encapsulamento, métodos getters e setters, ai quando for settar valor, use

[code]casa.setCor(“Branca”);

e não

casa.cor = "Branca";  

3º: O NullPointerException está ocorrendo, porque vc está acessando o atributo porta1, que vem da Classe Porta, e ele está Nulo, pois você acabou de criar o objeto Casa, para não ocorrer isso, voce teria que criar os objetos Porta (1,2,3) e setar eles para o atributo porta1,2,3 do seu objeto casa

Oi igor_ks
1º ponto ok,
2º ponto, ainda estou ainda estou aprendendo por isso não sei usá-los ainda,
o 3º ponto tentei fazer com que objeto porta fizesse parte do objeto casa, não sei se fiz direito.

[quote=Akyama]Oi igor_ks
1º ponto ok,
2º ponto, ainda estou ainda estou aprendendo por isso não sei usá-los ainda,
o 3º ponto tentei fazer com que objeto porta fizesse parte do objeto casa, não sei se fiz direito.[/quote]

Você tem que instanciar as portas das Casas.

A forma mais simples seria você adicionar esse código na sua classe Casa:

public Casa() {
porta1 = new Porta();
porta2 = new Porta();
porta3 = new Porta();
}

Lembre-se, quando você cria um objeto, caso eles não sejam inicializados manualmente o Java automaticamente os inicializa para você. Os valores abaixo são os valores que ele utiliza:

int = 0
short = 0
long = 0
double = 0.0
float = 0.0
char = (espaço)
byte = 0
boolean = false
Object = null

Portanto, quando você tentou acessar sua Porta, ela estava null o que resultou no NullPointerException.

Oi Sem_Nome muito obrigado o programa rodou plenamente! :smiley:

class Casa {
	String cor;
	Porta porta1 = new Porta();
	Porta porta2 = new Porta();
	Porta porta3 = new Porta();  
	
	void pinta(String S){
		this.cor = S;
	}
	
	int quantasPortasEstaoAbertas(){
		int i = 0;
		if(porta1.aberta == true){
			i += 1;
		}if(porta2.aberta == true){
			i += 1;
		}if(porta3.aberta == true){
			i += 1;
		}
		return i;
	}
	
	void mostra(){
		System.out.println("Cor da casa: "+this.cor);
		System.out.println("Cor da porta1: "+this.porta1.cor);
		System.out.println("DimensãoX da porta1: "+this.porta1.dimensaoX);
		System.out.println("DimensãoY da porta1: "+this.porta1.dimensaoY);
		System.out.println("DimensãoZ da porta1: "+this.porta1.dimensaoZ);
		System.out.println("Cor da porta2: "+this.porta2.cor);
		System.out.println("DimensãoX da porta2: "+this.porta2.dimensaoX);
		System.out.println("DimensãoY da porta2: "+this.porta2.dimensaoY);
		System.out.println("DimensãoZ da porta2: "+this.porta2.dimensaoZ);
		System.out.println("Cor da porta3: "+this.porta3.cor);
		System.out.println("DimensãoX da porta3: "+this.porta3.dimensaoX);
		System.out.println("DimensãoY da porta3: "+this.porta3.dimensaoY);
		System.out.println("DimensãoZ da porta3: "+this.porta3.dimensaoZ);
		System.out.println("As portas abertas são: "+this.quantasPortasEstaoAbertas());
	}
}

Agora vou aprender a programar levando em consideração o acrécimo de mais portas/janelas…etc. afinal somos programadores OO, obrigado a todos!