Erro ao executar programa
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:
Essa é minha classe casa:
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:
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
Curtidas 0
Melhor post
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
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
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
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
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
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
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
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
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
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
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
07/02/2015
Acho que entendi tudo agora obrigado Ronaldo =D me ajudou muito
GOSTEI 0