Construcoes if em metodos de retorno dao erro?

6 respostas
D

Pessoal, ontem eu estava fazendo uns exercicios da apostila caelum de java que me pareciam muito facil. Acabei mudando de ideia :cry: O exercicio pedia para fazer uma classe casa com 3 atributos porta e na classe casa, deveria ter um metodo (int quantasPortasEstaoAbertas()) para saber quantas portas estavam abertas. Na classe porta, o atributo que dizia se estava aberta ou nao, era do tipo booleano. Ate ai, tudo nas 1000 maravilhas, mas ele me acusou alguns erros que nao entendi. Segue os codigos:

public class Porta{
    private boolean aberta = false;//abaixo eu tinha feito os devidos metodos para abrir e fechar a porta, e estavam funcionando

int portaAberta(){// retorna o erro: missing return statement
    if(aberta){
       return 1;
     }
     }
}//como este metodo deu erro, e nao sei pq, decidi colocar um metodo na classe casa para controlar isso. Antes de mais nada, alguem sabe pq isso aqui deu erro?
[code]public class Casa{
      Porta porta1 = new Porta();
      Porta porta2 = new Porta();
      Porta porta3 = new Porta();
      int quantasPortas;
         int quantasPortasEstaoAbertas(){
           if(porta1.aberta){//neste ponto, eu tirei o modificador private do atributo aberta so para testes
                   quantasPortas+=1;
            }//nem terminei de fazer os ifs para os outros objetos pq me acusou um erro. Nao sei qual foi pq nao tenho nada para programar aqui em casa, mas alguem poderia testar isso e ver o erro?

quantasPortas = porta1.aberta?quantasPortas+=1:quantasPortas+=0;//aqui me da um erro que eu nunca imaginava: required variable  found value(ou algo assim). Esse erro so some, quando eu decho assim: quantasPortas = porta1.aberta?quantasPortas+=1:quantasPortas;
}
Alguem sabe pq de todos esses erros? System.out.println("Aguardo respostas!!!!!" + " URGENTEMENTE PLS!"); :lol:

6 Respostas

T
package libcomponentes;
public class Porta{
    private boolean aberta = false;

    boolean portaAberta(){
        return aberta;
    }
}

class Casa{
      Porta porta1 = new Porta();
      Porta porta2 = new Porta();
      Porta porta3 = new Porta();
      
      int quantasPortas = 0;
      
      int quantasPortasEstaoAbertas(){
        if(porta1.portaAberta()){
            quantasPortas+=1;
         }
       quantasPortas = porta1.portaAberta() ? quantasPortas + 1 :quantasPortas;
    }
}

Caso você não consiga entender pode perguntar!

Abraço!

fantomas
int portaAberta(){// retorna o erro: missing return statement   
    if(aberta){   
       return 1;   
     }   
}

Este método precisa de garantia de retorno de um valor int, como o retorno está sob uma condição e portanto não dando essa garantia a jvm informa o erro.

Ele poderia ser assim:

public int portaAberta() {  // <---- Coloque sempre a visibilidade do método (private, public, etc... )
    int result = 0;

    if(aberta){   
       result = 1;   
     }

     return result;   
}

As suas próximas dúvidas (o pq funcionou) estão relacionadas a questão da visbilidade dos atributos do objeto (public, private, protected e etc...) como o método não funcionou, vc "LIBEROU" (tornou publico -> public) o atributo aberta fazendo com o objeto resultante da classe Porta tivesse acesso direto a este atributo (pode parecer mas ISSO NÃO É UMA BOA).

DICA: a ) Faça uma revisão sobre visibilidade de métodos, classes e atributos urgentemente.
b ) Leia sobre ENCAPSULAMENTO o mais breve possível.

flws

leo_mf

Agora funciona.

public class Porta{  
	     private boolean aberta = false;  
   
     boolean portaAberta(){  
         return aberta;  
     }  
 }  
   
 class Casa{  
       Porta porta1 = new Porta();  
       Porta porta2 = new Porta();  
       Porta porta3 = new Porta();  
         
       int quantasPortas = 0;  
         
       int quantasPortasEstaoAbertas(){  
         if(porta1.portaAberta()){  
             quantasPortas+=1;  
          }  
        quantasPortas = porta1.portaAberta() ? quantasPortas + 1 :quantasPortas; 
        return quantasPortas;
     }  
 }

tem q colocar os retornos. se vc declara uma função q retorna alguma coisa ela tem q retorna alguma coisa.

leo_mf

Só mais um comentario:

fiz uma correção exatamente no codigo que o dono da duvida desenvolveu. Vou explicar oq ocorre:

1º - o metodo portaAberta() tem um return dentro de um if. Teria q ter um else com um return. O que ocorre se não entrar dentro do if, oq o metodo retorna? Esse é o problema, vc tem q garantir q ele retorne alguma coisa;
2º - Só pode ter uma classe publica dentro de um arquivo, vc declarou duas classes publicas em um arquivo;
3º - o metodo quantasPortasEstaoAbertas() nao tem um retorno, sendo q vc declarou ele com um retorno.

a correção ficou da seguinte maneira.

public class Porta {
	private boolean aberta = false;//abaixo eu tinha feito os devidos metodos para abrir e fechar a porta, e estavam funcionando  

	int portaAberta() {// retorna o erro: missing return statement  
		if (aberta) {
			return 1;
		} else {
			return 0;
		}
	}
}//como este metodo deu erro, e nao sei pq, decidi colocar um metodo na classe casa para controlar isso. Antes de mais nada, alguem sabe pq isso aqui deu erro?  

class Casa {
	Porta porta1 = new Porta();
	Porta porta2 = new Porta();
	Porta porta3 = new Porta();
	int quantasPortas;

	int quantasPortasEstaoAbertas(){  
            if(porta1.aberta){//neste ponto, eu tirei o modificador private do atributo aberta so para testes  
                    quantasPortas+=1;  
             }//nem terminei de fazer os ifs para os outros objetos pq me acusou um erro. Nao sei qual foi pq nao tenho nada para programar aqui em casa, mas alguem poderia testar isso e ver o erro?  
   
            quantasPortas = porta1.aberta?quantasPortas+=1:quantasPortas+=0;//aqui me da um erro que eu nunca imaginava: required variable  found value(ou algo assim). Esse erro so some, quando eu decho assim: quantasPortas = porta1.aberta?quantasPortas+=1:quantasPortas;
            return quantasPortas;
    }
}
D

Caramba!! Muito obrigado ao truck1n, fantomas e leo_mf. Agora entendi o que eu tinha feito de errado. heheheh
Eu ja tinha dado uma lida sobre encapsulamento, mas acabei dando uma “fubecada” e decidi nao levar a serio isso. ehhehe
Agora está tudo esclarecido! Muito obrigado mesmo!!(que pergunta mais besta, era so falta de atencao :oops: )
Vlw pessoal :wink:

fantomas

You are wellcome my friend, never give up!

flws

Criado 4 de novembro de 2008
Ultima resposta 4 de nov. de 2008
Respostas 6
Participantes 4