Erro Exception in thread "main" java.lang.NullPointerException

Boa tarde, estou iniciando em java e tenho esta questão :
O objetivo dos exercícios a seguir é fixar os conceitos vistos. Se você está com dificuldade em alguma parte desse capítulo, aproveite e treine tudo o que vimos até agora no pequeno programa abaixo:
Programa:Classe: Casa Atributos: cor, totalDePortas, portas[] Métodos: void pinta(String s), int quantasPortasEstaoAbertas(), 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.

Este e meu código:

public class Casa {
    String cor;
    int totalDePortas;
    Porta [] porta = new Porta[10];
    Porta portas = new Porta();

    
    void pinta (String s){
        this.cor = s;
        System.out.println("A cor da casa é : "+this.cor);
    }
    int totalDePortas(){
        int cont=0;
        for(int i = 0; i<=this.porta.length-1;i++){
              if(this.porta[i]!=null){
                  cont++;
              this.totalDePortas=cont;
           }
        }
        System.out.println("numero de portas : "+this.totalDePortas);
        return this.totalDePortas;
    }
   
    int quantasPortasEstaoAbertas(){
        int cont=0;
        for(int i = 1 ;i<= this.porta.length-1;i++){
            if(this.porta[i].estadoDaporta==true){
                cont++; 
                
            }  
        }
        System.out.println("Total de portas Abertas : "+cont);
        return cont;
    }
   
    
    void adicionaPorta(Porta p){
        for( int i = 0 ;i<= porta.length;i++){
            if(porta[i]==null){
            porta[i]=p;
            break;
            }
        }
    
public class testeMain {

    public static void main(String[] args) {
        Porta p1 = new Porta();
        Porta p2 = new Porta();
        Porta p3 = new Porta();
        Casa casa = new Casa();

        
        
        casa.adicionaPorta(p1);
        casa.adicionaPorta(p2);
        casa.adicionaPorta(p3);
       
        
        p1.estadoDaporta=true;
        p2.estadoDaporta=false;
        p3.estadoDaporta=true;

        
        casa.totalDePortas();
        casa.pinta("azul");
        casa.quantasPortasEstaoAbertas();
        
        
    }
}

public class Porta {
    boolean estadoDaporta;
}

porem , o método quantasPortasEstaoAbertas() esta dando o seguinte erro:
saída do programa :

numero de portas : 3
A cor da casa é : azul

Exception in thread “main” java.lang.NullPointerException
at br.caellum.ferreira.exArrayOO.Casa.quantasPortasEstaoAbertas(Casa.java:38)
at br.caellum.ferreira.exArrayOO.testeMain.main(testeMain.java:34)
C:\Users\Me\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)

alguém sabe me dizer o pq ?

Vamos lá, primeiro, toda classe deve ter nome iniciado em letra maiúscula (testeMain está minúsculo).
Depois, os atributos devem iniciar em minúsculo e seguir com camelCase (estadoDaporta).
Terceiro, você está iterando sbre um vetor, mas não verifica se a posição específica está nula ou não (for (int i = 1; i <= this.porta.length - 1; i++) { if (this.porta[i].estadoDaporta == true) {).
É neste ponto que estoura exceção.

O método quantasPortasEstaoAbertas() não está testando se a porta foi realmente criada.
O que você fez de errado foi testar o atributo estadoDaporta antes de testar se o objeto porta[i] realmente foi criado:

if(this.porta[i].estadoDaporta==true){
    cont++; 
} 

Para resolver adicione um teste antes no mesmo if, deixando ele assim:

if(this.porta[i] != null && this.porta[i].estadoDaporta==true){
    cont++; 
}

Fazendo dessa forma, você primeiro testa se o objeto porta[i] existe e depois testa se a porta esta aberta.

Cara vlw pela atenção ,mas não funcionou

Revi sua classe Casa e percebi que o erro não está apenas no método quantasPortasEstaoAbertas, vamos as correções:

Os atributos da classe Casa:

public class Casa {
	String cor;
	int totalDePortas;
	Porta[] portas = new Porta[10];

Na sua classe, você criou um array de Portas (Porta [] porta) e uma porta única (Porta portas), que eu creio que seja um equívoco.

Método totalDePortas:

int totalDePortas() {
        int count = 0;
	
	for (int i = 0; i < this.portas.length; i++) {
		if (this.portas[i] != null)
			count++;
	}
	this.totalDePortas = count;
	
	System.out.println("Numero de portas: " + this.totalDePortas);
	
	return this.totalDePortas;
}

O seu erro aqui foi colocar a atribuição this.totalDePortas=cont; dentro do laço.

Método quantasPortasEstaoAbertas:

int quantasPortasEstaoAbertas() {
	int count = 0;
	
	for (int i = 0; i < this.portas.length; i++) {
		if (this.portas[i] != null && this.portas[i].estadoDaPorta == true) {
			count++;
		}
	}
	
	System.out.println("Total de portas abertas: " + count);
	
	return count;
}

Já havia sugerido a modificação.

Rodei o mesmo teste que você e funciou tranquilo, espero ter ajudado.

1 curtida