Missing return statement

7 respostas
W

Pessoal estou começando aprender java, baixei a apostila da Caleum FJ-11, mas tenho encontrado algumas dificuldades, por isso gostaria da ajuda de vocês.

Estou com problemas no metodo contem () que deveria rtornar um valor booleano, mas o compilador java informa o erro " missing return statement " na minha classe Empresa

Abaixo o codigo das duas classes:

class Empresa {
	//Atributos
	String nome;
	String cnpj;
	Funcionario[] funcionarios= new Funcionario[10];

	int i=0;
	
	void adiciona(Funcionario f) {
		this.funcionarios[i]=f;
		System.out.println("O nome do funcionario e " + this.funcionarios[i].nome);
		System.out.println("O RG do funcionario e " + this.funcionarios[i].rg);
		System.out.println("O salario do funcionario e " + this.funcionarios[i].salario);
		System.out.println("O funcionario esta ativo " + this.funcionarios[i].ativo);
		System.out.print(this.funcionarios[i].dataDeEntrada.dia);
		System.out.print("/" + this.funcionarios[i].dataDeEntrada.mes);
		System.out.println("/" + this.funcionarios[i].dataDeEntrada.ano);		
		i=i+1;	
			
	}

	boolean contem (Funcionario f) {
		for ( int y=0; y==funcionarios.length; y++) {
			if (f.nome== this.funcionarios[y].nome) {
				return true;
				
			}
			else {
				return false;
				
			}
		}
	}
	
}


class CriaEmpresa {
	public static void main (String [] args) {
		Empresa emp;
		emp = new Empresa();
		emp.nome="Empresa Ibirapuera";
		emp.cnpj="07.088.915/0011-12";
		
		
		Funcionario f1 = new Funcionario();
		f1.nome="Fulano";
		f1.rg="65780930";
		f1.salario=5000;
		
		Data entrada = new Data();
		entrada.dia=15;
		entrada.mes=05;
		entrada.ano=2007;
		
		f1.dataDeEntrada= entrada;
		emp.adiciona(f1);


		
		Funcionario f2 = new Funcionario();
		f2.nome="Siclano da Silva";
		f2.rg="28776579-9";
		f2.salario=3000;
		
		Data entrada2 = new Data();
		entrada2.dia=05;
		entrada2.mes=03;
		entrada2.ano=2002;
		
		f2.dataDeEntrada= entrada2;
		emp.adiciona(f2);

		Funcionario f3 = new Funcionario();
		f3.nome="Barck Hussein Obama";
		f3.rg="gfrh19864";
		f3.salario=3000000;
		
		Data entrada3 = new Data();
		entrada3.dia=01;
		entrada3.mes=01;
		entrada3.ano=2009;
		
		f3.dataDeEntrada= entrada3;
		emp.adiciona(f3);

		Funcionario f4 = new Funcionario();
		
		boolean j=emp.contem(f3);
		System.out.println(j);
		
	}
}

7 Respostas

F

Tu precisa retornar alguma coisa fora do for. Quando o loop cair fora do for, o que será retornado? Nada! E o compilador está esperando por um boolean.

Por isso adiciona algum retorno boolean default fora do for, para quando a condição não for atendida.

Até.

thiago.correa
O compilador faz uma análise e ele prevê que o teu método possa nunca entrar no laço for, então ele te obriga a colocar a instrução return fora do laço, o teu método poderia ser substituido por
boolean contem (Funcionario f) {   
        for ( int y=0; y==funcionarios.length; y++) {   
            if (f.nome== this.funcionarios[y].nome) {   
                return true;   
                   
            }   
        }
         return false;   
   
    }

Outra coisa, esse método vai lançar uma exceção quando você executá-lo e não terá o resultado esperado, um dos erros está relacionado ao percorrer o vetor e o outro na comparação de string, uma dica, == valida se as referências apontam para o mesmo objetos em memória, pesquise sobre comparação de strings

Andre_Fonseca

O erro acontece porque o compilador não sabe o que retornar

tente mudar para isso

boolean contem(Funcionario f) { boolean result=false; for (int y = 0; y == funcionarios.length; y++) { if (f.nome == this.funcionarios[y].nome) { result=true; } } return result; }

F
Para complementar, comparações de String é com o método equals:

if (f.nome== this.funcionarios[y].nome)

fica

if (f.nome.equals(this.funcionarios[y].nome))

== Com String está comparando se é a mesma referência.

hiram

Opa! Suponha que o programa, por alguma razão, não consiga entrar dentro do seu loop for… O que o método retornaria? Considerando que todos os seus returns foram colocados dentro do “for” em “if” ou “else”, em alguma situação a declaração “return” poderia ser “unreachable”. Por exemplo, se o funcionários estivesse vazio.

(Seu código possui outros erros que corrijo)

Fazendo da seguinte maneira você terá o resultado que esperava:

boolean contem (Funcionario f) {  
        for ( int y=0; y < funcionarios.length; y++) {
            if (f.nome.equals(this.funcionarios[y].nome)) {  
                return true; // O return interrompe a execução do método com True
            }
        }
        return false; // O programa  irá passar aqui se todo o array for percorrido e "f" não estiver contido em funcionarios. Logo, conter() é False.
}

[]'s

W

Muito obrigado pela ajuda de todos, agora entendi o porquê do erro de compilação.
Sobre o uso do método equals, não havia lido nada sobre ele na apostila da Caelum, provavelmente ainda não cheguei ao capitulo que fala sobre esses métodos de comparação de Strings.
De qualquer maneira o programa funcionou das duas maneiras, apenas tive que modificar mais um item no “for” baseado nos exemplos postados

Em vez de:

for (int y = 0; y == funcionarios.length; y++)

Tive que usar :

for ( int y=0; y < funcionarios.length; y++)

A instrução com “==” sempre retornava false, somente alterando a instrução para “<” passou a retornar corretamente o resultado, mas não entendi o por que?

Mais uma vez, muito obrigado pela ajuda de todos.

thiago.correa

A instrução for vai ser executada até que a condição que você criou seja falsa, como y começava do zero, o for só seria executado quando o seu array fosse de tamanho zero, ou seja você está dizendo o seguinte, execute o laço enquanto y for igual ao tamanho do vetor, o que na verdade o certo seria, execute o laço enquanto y for MENOR que o tamanho do vetor.

Dê uma lida nos fundamentos da linguagem, tenha esses conhecimentos bem solidificados

Criado 15 de junho de 2009
Ultima resposta 16 de jun. de 2009
Respostas 7
Participantes 6