Erros com Exercício

7 respostas
urieljuliatti

Boa tarde pessoal, sou iniciante emJava e estou tendo problemas para resolver um exercício:

Estou recebendo esse seguinte erro:

Exception in thread "main" java.lang.NullPointerException
        at exerciciosoo.Casa.fechaPorta(Casa.java:46)
        at exerciciosoo.Main.main(Main.java:24)
Java Result: 1

Ok, já identifiquei que a referência é nula a minha variável consultada ou pesquisada, mas porque?

Quase toda minha aplicação retorna isso quando preciso fazer testes.

Vou postas as classes:

Main
package exerciciosoo;

/**
 *
 * @author Uriel
 */
public class Main {
    
    public static Casa casa = new Casa("Uriel", 40);

    public static void main(String[] args) {
        
          casa.setPortas(4);
          System.out.println(casa.getPortas());

          casa.fechaPorta(4);
          casa.fechaPorta(2);
          casa.abrePorta(1);
          casa.abrePorta(3);
          
          System.out.println("O numero de portas abertas são: " + casa.portasAbertas());

    }

}
Construção
package exerciciosoo;

/**
 *
 * @author Uriel
 */
public class Construcao {
    protected int numero;
    protected Pessoa proprietario;

     public Construcao(String nome, int numero)
    {
        this.numero = numero;
        this.proprietario = new Pessoa(nome);
    }
    
    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public Pessoa getProprietario() {
        return proprietario;
    }

    public void setProprietario(Pessoa proprietario) {
        this.proprietario = proprietario;
    }
}

Casa

package exerciciosoo;

/**
 *
 * @author Uriel
 */
public class Casa extends Construcao {
    
    private Porta [] portas;

    public Casa(String nome, int numero)
    {
        // Referencia a superclasse
        super(nome, numero);
    }

    // Devolve o numero de portas
    public int getPortas() {
        return portas.length;
    }

    public void setPortas(int num) {
        this.portas = new Porta[num];
    }

    public Porta getPorta(int index)
    {
        
      Porta porta_selecionada = new Porta();

      for(int i = 1; i < portas.length; i++ )
      {
           porta_selecionada = portas[index];
      }

      return porta_selecionada;
    }

    public void fechaPorta(int index)
    {
       Porta porta_selecionada = new Porta();

      for(int i = 0; i < portas.length; i++ )
      {
           porta_selecionada = portas[index-1];
           porta_selecionada.fechar();
      }
    }

    public void abrePorta(int index)
    {
       for(int i = 0; i < portas.length; i++ )
      {
           Porta porta_selecionada = portas[index-1];
           porta_selecionada.abrir();
      }
    }

    public int portasAbertas()
    {
      int abertas = 0;
      Porta porta_selecionada = new Porta();
      for(int i = 0; i < portas.length; i++ )
      {
           porta_selecionada = portas[i];
           if(porta_selecionada.getStatus())
           {
               abertas++;
            }
      }
      return abertas;
    }

    public int portasFechadas()
    {
      int fechadas = 0;
      Porta porta_selecionada = new Porta();
      for(int i = 0; i < portas.length; i++ )
      {
           porta_selecionada = portas[i];
           if(!porta_selecionada.getStatus())
           {
               fechadas++;
            }
      }
      return fechadas;
    }
    
}

Porta

package exerciciosoo;

/**
 *
 * @author Uriel
 */
public class Porta {

    private boolean aberto = false;

   public void abrir()
    {
       aberto = true;
    }

   public void fechar()
    {
      aberto = false;
    }

   public boolean getStatus()
    {
       return aberto;
   }

}

7 Respostas

S

Altere a linha public static Casa casa = new Casa("Uriel", 40);
para

Casa casa = new Casa("Uriel", 40);

Veja se dá certo.

urieljuliatti

Opa, obrigado pela resposta, amigo.

Mas não deu certo… Aparece um erro descrito como: “non static variable casa can’t be referenced from a static context.”

S

Posta a classe Pessoa tbm pra eu rodar teu projeto.

S
package exerciciosoo;

/**
 * 
 * @author Uriel
 */
public class Main {

	 

	public static void main(String[] args) {
		
		Casa casa = new Casa("Uriel", 40);
		casa.setPortas(4);
		System.out.println(casa.getPortas());

		casa.fechaPorta(4);
		casa.fechaPorta(2);
		casa.abrePorta(1);
		casa.abrePorta(3);

		System.out.println("O numero de portas abertas são: "
				+ casa.portasAbertas());

	}

}
urieljuliatti

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package exerciciosoo;

/**
*

  • @author Uriel
    */
    public class Pessoa {

    private String nome;

    public Pessoa(String nome)
    
    {
    
    this.nome = nome;
    
    }
    

}

GuilhermeKFreitas

urieljuliatti , apenas dei uma olhada rápida pelo código, mas percebi que você usa o setPortas(int num) para instanciar o array de Portas, mas você não instancia as portas em si !

Você cria o objeto array, mas não os objetos Porta.!

public void setPortas(int num) {  
        this.portas = new Porta[num];  
        // instancia um novo array, mas todas as suas referências são null.
    }

Para criar as portas, você pode utilizar um laço for:

public void setPortas(int num) {  
        this.portas = new Porta[num];  
        for( int i = 0; i < portas.length; i++ ){
            portas[i] = new Porta(); 
        }
    }

Confirma aí se é isso mesmo.

urieljuliatti

Opa Guilherme, genial! Genial!

O problema em si era com a sintaxe, a forma de instanciar!

Agora uma pergunta a vocês, a lógica do código, de se abrir e fechar as portas da Casa está bem feita? De acordo com a teoria da OO…

Me agradaria muito opiniões diferentes!

Criado 5 de fevereiro de 2011
Ultima resposta 5 de fev. de 2011
Respostas 7
Participantes 3