Erro ao executar programa

Java

07/02/2015

Estou aprendendo java através da apostila da caelum e estou com um problema no exercício no qual tenho que fazer uma casa ao executar o programa, nessa classe casa utilizo uma classe porta para incrementar como pedido no exercicio as 2 classes compilam tranquilamente sozinhas, mas ao executar o metodo main para testar a classe casa usando algum metodo das 2 classes da um erro de nullpointexception, segue os codigos abaixo:

Essa é minha classe porta:

class Porta {
	String cor = "Marrom";
	boolean aberta = true;
	double dimensaoX = 80, dimensaoY = 180, dimensaoZ = 10;
	
	void abre(){
		this.aberta = true;
	}
	void fecha(){
		this.aberta = false;
	}
	void pinta(String s){
		this.cor = s;
	}
	boolean estaAberta(){
		if(aberta == true){
			System.out.println("Aberta");
		}else{
			System.out.println("Fechada");
		}
	return this.aberta;
	}
}


Essa é minha classe casa:

class Casa {
	String cor;
	Porta porta1, porta2, porta3;
	int i = 0;
	
	void pinta(String s){
		this.cor = s;
	}
	int quantasPortasEstaoAbertas(){
		if(porta1.aberta == true){
			this.i++;
		}
		if(porta2.aberta == true){
			this.i++;
		}
		if(porta3.aberta == true){
			this.i++;
		}
		return this.i;
	}
}


E esse é o método main que utilizo para testar as classes é quando tento compilar ele utilizando algum dos metodos das classes como o quantasPortasEstaoAbertas() da o erro:

class TestaPorta{
	public static void main(String[] args){
		Casa casa = new Casa();
		
		casa.pinta("Azul");
		System.out.println(casa.cor);
		casa.quantasPortasEstaoAbertas();
	}
}
Jonathan

Jonathan

Curtidas 0

Melhor post

Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

VocÊ precisa instanciar as Portas dentro da casa, caso contrário o erro continuará. Tente mudar sua classe Casa :

class Casa {
    String cor;
    Porta porta1 new Porta();
    Porta porta2 = new Porta();
    Porta porta3 = new Porta();
    int i = 0;
     
    void pinta(String s){
        this.cor = s;
    }
    int quantasPortasEstaoAbertas(){
        if(porta1.aberta == true){
            this.i++;
        }
        if(porta2.aberta == true){
            this.i++;
        }
        if(porta3.aberta == true){
            this.i++;
        }
        return this.i;
    }
}
GOSTEI 1

Mais Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

VocÊ precisa instanciar as Portas dentro da casa, caso contrário o erro continuará. Tente mudar sua classe Casa :

class Casa {
    String cor;
    Porta porta1 new Porta();
    Porta porta2 = new Porta();
    Porta porta3 = new Porta();
    int i = 0;
     
    void pinta(String s){
        this.cor = s;
    }
    int quantasPortasEstaoAbertas(){
        if(porta1.aberta == true){
            this.i++;
        }
        if(porta2.aberta == true){
            this.i++;
        }
        if(porta3.aberta == true){
            this.i++;
        }
        return this.i;
    }
}
GOSTEI 1
Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

VocÊ precisa instanciar as Portas dentro da casa, caso contrário o erro continuará. Tente mudar sua classe Casa :

class Casa {
    String cor;
    Porta porta1 new Porta();
    Porta porta2 = new Porta();
    Porta porta3 = new Porta();
    int i = 0;
     
    void pinta(String s){
        this.cor = s;
    }
    int quantasPortasEstaoAbertas(){
        if(porta1.aberta == true){
            this.i++;
        }
        if(porta2.aberta == true){
            this.i++;
        }
        if(porta3.aberta == true){
            this.i++;
        }
        return this.i;
    }
}
GOSTEI 1
Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

VocÊ precisa instanciar as Portas dentro da casa, caso contrário o erro continuará. Tente mudar sua classe Casa :

class Casa {
    String cor;
    Porta porta1 new Porta();
    Porta porta2 = new Porta();
    Porta porta3 = new Porta();
    int i = 0;
     
    void pinta(String s){
        this.cor = s;
    }
    int quantasPortasEstaoAbertas(){
        if(porta1.aberta == true){
            this.i++;
        }
        if(porta2.aberta == true){
            this.i++;
        }
        if(porta3.aberta == true){
            this.i++;
        }
        return this.i;
    }
}
GOSTEI 1
Jonathan

Jonathan

07/02/2015

Eu tenho outra dúvida no caso do método quantasPortasEstaoAbertas(), no exercício diz que tem quer ser int o valor de retorno, só que do jeito que eu fiz se ele fosse void também não mudaria nada então como faço para ele ter o retorno do tipo int e ser realmente efetivo sem que eu possa alterar para void, e se possível alguém puder me explicar como funciona esse return dos métodos porque eu fico me perguntado ele retorna para algum lugar mas eu não sei pra onde, sei que pode dizer que é para quem o chamou mas ainda assim não entendo o valor não tem que estar ligado a alguma variável?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

Eu tenho outra dúvida no caso do método quantasPortasEstaoAbertas(), no exercício diz que tem quer ser int o valor de retorno, só que do jeito que eu fiz se ele fosse void também não mudaria nada então como faço para ele ter o retorno do tipo int e ser realmente efetivo sem que eu possa alterar para void, e se possível alguém puder me explicar como funciona esse return dos métodos porque eu fico me perguntado ele retorna para algum lugar mas eu não sei pra onde, sei que pode dizer que é para quem o chamou mas ainda assim não entendo o valor não tem que estar ligado a alguma variável?


VEja bem, no seu caso o retorno do método ser 'int' é desnecessário já que este não é usado. Quando você retorna algum valor de um método (int, boolean, String e etc) é esperado que alguém vá usar este retorno, caso contrário não precisaria de retorno e consequentemente seria void.

class TestaPorta{
    public static void main(String[] args){
        Casa casa = new Casa();
         
        casa.pinta("Azul");
        System.out.println(casa.cor);
       int qtdPortasAbertas = casa.quantasPortasEstaoAbertas();
      System.out.println(qtdPortasAbertas);
    }
}


No exemplo acima estou usando o retorno.
GOSTEI 0
Jonathan

Jonathan

07/02/2015

Deixa ver se eu entendi seu código para utilizar o retorno do método devo definir um atributo para receber o retorno é isso? Como no seu caso o atributo qtdPortasAbertas esta recebendo o retorno do método casa.quantasPortasEstaoAbertas() é isso?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

Deixa ver se eu entendi seu código para utilizar o retorno do método devo definir um atributo para receber o retorno é isso? Como no seu caso o atributo qtdPortasAbertas esta recebendo o retorno do método casa.quantasPortasEstaoAbertas() é isso?


Não necessariamente um atributo. Bom, para você saber se o seu método precisa ou não de um retorno faça a seguinte pergunta a si mesmo: "Eu vou usar este retorno em algum lugar ? "
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

Deixa ver se eu entendi seu código para utilizar o retorno do método devo definir um atributo para receber o retorno é isso? Como no seu caso o atributo qtdPortasAbertas esta recebendo o retorno do método casa.quantasPortasEstaoAbertas() é isso?


Não necessariamente um atributo. Bom, para você saber se o seu método precisa ou não de um retorno faça a seguinte pergunta a si mesmo: "Eu vou usar este retorno em algum lugar ? "
GOSTEI 0
Jonathan

Jonathan

07/02/2015

Não entendi, se não é da maneira que esta no seu código "int qtdPortasAbertas = casa.quantasPortasEstaoAbertas();" como é o esquema para utilizar o retorno de um método então? O retorno não precisa ir para um atributo como você colocou?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

07/02/2015

não meu caro, o retorno é um retorno e ponto final, independente se você usá-lo ou não ele vai existir. No meu caso optei por guardá-lo na variável qtdPortasAbertas mas se você não quiser usá-lo também não dará erro algum no seu programa, apenas não estará semanticamente correto mas sintaticamente sim.
GOSTEI 1
Jonathan

Jonathan

07/02/2015

Acho que entendi tudo agora obrigado Ronaldo =D me ajudou muito
GOSTEI 0
POSTAR