Fórum Erro ao executar programa #509873

07/02/2015

0

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

Responder

Post mais votado

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;
    }
}

Ronaldo Lanhellas

Ronaldo Lanhellas
Responder

Gostei + 1

Mais Posts

07/02/2015

Ronaldo Lanhellas

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;
    }
}
Responder

Gostei + 1

07/02/2015

Ronaldo Lanhellas

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;
    }
}
Responder

Gostei + 1

07/02/2015

Ronaldo Lanhellas

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;
    }
}
Responder

Gostei + 1

08/02/2015

Jonathan

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?
Responder

Gostei + 0

10/02/2015

Ronaldo Lanhellas

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.
Responder

Gostei + 0

12/02/2015

Jonathan

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?
Responder

Gostei + 0

12/02/2015

Ronaldo Lanhellas

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 ? "
Responder

Gostei + 0

12/02/2015

Ronaldo Lanhellas

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 ? "
Responder

Gostei + 0

13/02/2015

Jonathan

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?
Responder

Gostei + 0

14/02/2015

Ronaldo Lanhellas

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.
Responder

Gostei + 1

14/02/2015

Jonathan

Acho que entendi tudo agora obrigado Ronaldo =D me ajudou muito
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar