Porque não compila esta clase?

Boa tarde sou iniciante em java, e já tentei de todas as formas, mas este meu código não compila. Alguém poderia me ajudar a achar o erro. Eis o código:

class Empresa {
  String nome;
  String cnpj;
  Funcionario [ ] vetFuncionarios= new Funcionario[3];
  
 void adiciona(Funcionario f) {
   for(int cont=0;cont<this.vetFuncionarios.length;cont++) {
    if (this.vetFuncionarios[cont]==null) {
       System.out.println("Adicionando Funcionario: " + cont );
        this.vetFuncionarios[cont]=f;
        break;
      }
   else 
      if (cont==this.vetFuncionarios.length - 1) 
         System.out.println("A array está cheia");
   }
 }

  boolean contem(Funcionario f)  {
    for(int cont=0;cont<this.vetFuncionarios.length;cont++) {
        if (this.vetFuncionarios[cont]==f) {
                break;
                return true;
             }
       else {
                if (cont==this.vetFuncionarios.length - 1) 
                return false;
              }
        }   
    }
}

O erro está no metodo contém , este método me diz se já existe uma referencia f, na minha Array de Funcionarios, mas o erro que dá é unreachable statement?
Porque dá este erro?

Att

se a instrução break vem antes de return , o return nunca acontecerá porque o break sempre colapsa o fluxo para o inicio do for. Logo a intrução return é inalcansável e o java reporta isso como uma exceção de compilação.

boolean contem(Funcionario f) { for(int cont=0;cont<this.vetFuncionarios.length;cont++) { if (this.vetFuncionarios[cont]==f) { break; // aqui está o erro return true; } else { if (cont==this.vetFuncionarios.length - 1) return false; } } }

Use o eclipse ou outra ide para o ajudar a identificar os problemas.

As instruções break e return são imcompativeis. Se vc quer sair do for retornando um valor só precisa do return.
O for será automáticamente interrompido. Se vc quer parar o for e continuar fora dele use o break e não o return.

Obrigado. Eu mudei o código agora, mas me gerou outro erro.

boolean contem(Funcionario f)  {
    for(int cont=0;cont<this.vetFuncionarios.length;cont++) {
        if (this.vetFuncionarios[cont]==f  &&  cont<this.vetFuncionarios.length - 1) 
                 return true;
       else 
            return false;
      }   
   }

O erro agora eh missing return statement, tá dizendo que falta o retorno de declaração, mas eu já coloquei o retorno certo desta vez.

Att

[quote=danielbussade]Obrigado. Eu mudei o código agora, mas me gerou outro erro.

boolean contem(Funcionario f)  {
    for(int cont=0;cont<this.vetFuncionarios.length;cont++) {
        if (this.vetFuncionarios[cont]==f  &&  cont<this.vetFuncionarios.length - 1) 
                 return true;
       else 
            return false;
      }   
   }

O erro agora eh missing return statement, tá dizendo que falta o retorno de declaração, mas eu já coloquei o retorno certo desta vez.
[/quote]

Parece que está com problemas para entender o fluxo.
VC faz um for, se uma certa condição for verdadeira retorna true, se a condição é falsa retorna false.
Para que é que serve o for afinal se na primeira vez que vc faz o teste já retorna um resultado ?

não será que vc quer fazer isto

boolean contem(Funcionario f)  {
    for(int cont=0;cont<this.vetFuncionarios.length;cont++) {
        if (this.vetFuncionarios[cont]==f  &&  cont<this.vetFuncionarios.length - 1) 
                 return true; // se algunma das posiçoes encontrou 
        }
   }
    return false; // se nenhuma deu certo . repara que isto fica fora do for
}

Obrigado Sérgio, realmente agora entendi o que estava fazendo de errado!

o erro está nessa linha:

if (cont==this.vetFuncionarios.length - 1) return false;

devido essa execucao nao ser garantida… entao… se isso for false… qual é o tipo de return do seu metodo? Não tem… e nesse caso seu metodo tem que ter um tipo de return.
mude assim:

# boolean contem(Funcionario f)  {  
#     for(int cont=0;cont<this.vetFuncionarios.length;cont++) {  
#         if (this.vetFuncionarios[cont]==f) {  
#                 break;  
#                 return true;  
#              }  
#        else {  
#                 if (cont==this.vetFuncionarios.length - 1)   
#                 return false;  
#               }  
#         } 
return true;    
#     }  
# }  

flw!

Só para finalizar, quando esta linha:

if (cont==this.vetFuncionarios.length - 1)     
                 return false;     
               }     

for verdadeira ele simplesmente return false, e nao executa o outro return que tem logo após sair do laço.
É isso mesmo?

Att

sim… o metodo quando encontra return ele para de executar! :smiley: pois vc está dizendo retorna o valor…
observe esse codigo:

class Obser{
static void chama(){
for(int x=0;x<5;x++){
if(x==3){
return
}
System.out.println(x);
}
public static void main(String arg[]){
chama();
}
}

Veja quantas vezes ele executou… qdo o if for true o metodo para de executar…