Solucionado (ver solução)
Solucionado
(ver solução)
17
respostas

Retorno de método booleano

Com esse método:

    public boolean contem(Funcionario f) {
        for(int i = 0; i < this.empregados.length;i++){
           if(this.empregados[i] == f){
                return true;
            }
        }
        return false;
    }

Se eu passar uma variável que é referência para um objeto que não existe, o método retorna true. Como evitar isso?

System.out.println(caelum.contem(f4)); // não criei f4 e retorna true!

17 respostas

E se você perguntar, logo no início da contem, se o argumento recebido é null? Algo assim:

if (f4.nome != NULL){
     executa a busca
} else {
     emite mensagem
}

Mesmo que dê certo, me parece estranho esta igualdade ocorrer.Será que seu laço não está indo além dos dados que existem? Neste caso estaria comparando NULL com NULL e o resultado seria TRUE

Fabio eu não sei se compreendi o que você quer dizer. coloquei o seguinte código na classe etestaEmpresa

        Funcionario f4 = new Funcionario();
        if (empresa.contem(f4)){
            System.out.println("contem 1");
        }
        f4 = empresa.empregados[2];
        if (empresa.contem(f4)){
            System.out.println("contem 2");
        }

A minha saída exibiu "contem 2". Qual é exatamente a situação que vc está enfrentando, pois, quando você diz "não criei f4", parece que vc se refere que não declarou esta variável. Mas se não declarou, é óbvio, que nem iria compilar...

Realmente Fábio, está estranho. Poste o seu código de chamada do método contém todo, assim poderemos verificar o que está ocorrendo.

Cara, acho que foi algum bug. To usando o www.sourcelair.com pra fazer os exercícios. Hoje eu rodei o programa e retornou false oO

public class TestaEmpresa {

    public static void main(String[] args){


        Empresa caelum = new Empresa(5);

        Funcionario f1 = new Funcionario("Fabio");
        Funcionario f2 = new Funcionario("Joao");
        Funcionario f3 = new Funcionario("Jose");

        f1.setDataEntrada(new Data(21, 01, 2015));
        f2.setDataEntrada(new Data(21, 01, 2015));



        caelum.adiciona(f1);
        caelum.adiciona(f2);

        caelum.mostraEmpregados();

        System.out.println(caelum.contem(f5));
    }
}

public class Empresa {

    private String nome;
    private int cnpj;
    private Funcionario[] empregados;

    Empresa(int quantosEmpregados){
       this.empregados = new Funcionario[quantosEmpregados];

    }


    public void adiciona(Funcionario f){
        for(int i = 0; i < empregados.length;i++){
            if(empregados[i] == null){
                this.empregados[i] = f;
                break;
            }
        }
    }

    public void mostraEmpregados(){
        for(int i = 0; i < empregados.length;i++){
            if(empregados[i] != null) {
            empregados[i].mostra();
            } else {
                System.out.println("espaco vazio");
            }

        }
    }

    public boolean contem(Funcionario f) {
        for(int i = 0; i < this.empregados.length;i++){
           if(this.empregados[i] == f){
                return true;
            }
        }
        return false;
    }

     public void setNome(String nome){
        this.nome = nome;
    }

    public String getNome(){
        return this.nome;
    }

     public void setCNPJ(int cnpj){
        this.cnpj = cnpj;
    }

    public int getCnpj(){
        return this.cnpj;
    }

    public Funcionario getFuncionario (int posicao) {
                return this.empregados[posicao];
    }
}

Fábio,

Este código não compila! A variável f5 não está nem definida!

Abraço!

Estranho, no sourcelair compila e retorna false. Não testei no eclipse ainda...

Fábio, o que a Joviane disse está correto. A variável F5 não foi declarada, logo não pode compilar de forma alguma. Nunca tinha visto esse SourceLair. É interessante, mas dá para ver que ele não é confiável, já que está deixando passar uma variável que não foi declarada. Use o Eclipse ou o NetBeans. São ambientes confiáveis para criação e teste de programas de todos os níveis.

concordo com o Sandro. Poste o resultado depois.

É verdade. Eu uso o NetBeans (acho mais amigável), mas o Eclipse também é tão confiável quanto.

Cara no seu codigo o return do if esta no lugar errado

public boolean contem(Funcionario f) { for(int i = 0; i < this.empregados.length;i++){ if(this.empregados[i] == f){ return true; } // deveria estar aqui e nao aonde esta } return false; }

Caras que complicação para nada. Man basta verificar antes:

public boolean contem(Funcionario f) {
for(int i = 0; i < this.empregados.length;i++){

if(this.empregados[i] == f){
return true;
}
}
return false;
}

Por algum motivo foi enviado a resposta acima!

```
public boolean contem(Funcionario f) {
    for(int i = 0; i < this.empregados.length;i++){
       if(null != f) {
          if(this.empregados[i] == f){
            return true;
          }
       }
    }
    return false;
}
solução!

Bruno, acho que você não entendeu. O problema dele não é se F5 existe no array, mas que a variável nem foi declarada. Isso é um erro de codificação que deve ser bloqueado em tempo de compilação pelo Java. Todos os compiladores trabalham assim, exceto alguns através de diretivas de compilação muito específicas, de qualquer forma não é o caso do Java. Por esse motivo esse programa não deveria nem compilar, mas o SourceLair está se comportando de forma errada e retornando False, quando deveria na verdade disparar uma Exception. O Erro não está no código do método contem, mas na chamada do método em que é passada uma variável que nem foi declarada. Como o compilador saberia o que é F5, se ela não foi declarada? Ele não tem como tratar isso, realizar a verificação de tipos, etc. logo deveria ser gerada uma exceção para alertar o programador que aquela variável deve ser declarada.

Vim cobrar meus 30 pontos de resposta solucionadora, kkkkkkkkkkk

Desde o início eu disse que não compilava.

Sidnei, vou marcar a sua porque você falou antes, mas a última do Sandro foi mais completa.

Faz favor devolve a situação anterior.

Era uma piada.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software