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

enhanced-for não funciona

Alguém poderia dar uma olhada no meu código e ver o que está errado? Agradeço desde já!

class Data {
    int dia;
    int mes;
    int ano;

    void atribui(int d, int m, int a) {
        this.dia = d;
        this.mes = m;
        this.ano = a;
    }

    void imprime() {
        System.out.println("Data: " + this.dia + "/" + this.mes + "/" + this.ano);
    }
}

class Funcionario {
    String nome;
    String departamento;
    double salario;
    Data dataEntrada;
    String rg;

    void recebeAumento(double aumento) {
        this.salario += aumento;
    }

    double calculaGanhoAnual() {
        return (12 * this.salario);
    }

    void mostra() {
        System.out.println("Nome: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("Salario: " + this.salario);
        this.dataEntrada.imprime();
        System.out.println("RG: " + this.rg);
    }
}

class Empresa {
    String nome;
    String cnpj;
    Funcionario[] empregados;

    void adiciona(Funcionario f) {
        for (Funcionario x : this.empregados) {
            if (x == null) {
                x = f;
                break;
            }
        }
    }
}

class Programa {
    public static void main (String[] args) {
        Funcionario mauricio = new Funcionario();
        mauricio.nome = "Mauricio Aniche";
        mauricio.departamento = "Desenvolvimento";
        mauricio.salario = 1000;
        mauricio.dataEntrada = new Data();
        mauricio.dataEntrada.atribui(31, 05, 2016);
        mauricio.rg = "9510286";
        mauricio.mostra();

        Empresa alura = new Empresa();
        alura.nome = "Alura";
        alura.empregados = new Funcionario[10];
        alura.adiciona(mauricio);
        alura.empregados[0].mostra();
    }
}
7 respostas

qual erro que ta mostrando?

Recebo o seguinte erro:

Exception in thread "main" java.lang.NullPointerException
        at Programa.main(erro.java:71)

Acredito que como seu array tem 10 casas o foreach vai passar pela primeira, que esta preenchida, mas na proxima ele vai passar por uma nula. Tente usar um for normal.

solução!

O erro é que esse for não está atribuindo o objeto funcionário ao Array de funcionários, seu código:

void adiciona(Funcionario f) {
        for (Funcionario x : this.empregados) {
            if (x == null) {
                x = f;
                break;
            }
        }
    }

dentro desse for você transforma cada posição do Array em uma variável local chamada x só que você não atribui ela de volta para o Array, quando o método mostra() é chamado o Array está vazio e isso faz o erro ocorrer. Então temos duas opções, você adiciona uma variável no objeto assim (Mas dessa forma não tem por que utilizar um for):

class Empresa {
    String nome;
    String cnpj;
    Funcionario[] empregados;
    int livre = 0;

    /*void adiciona(Funcionario f) {
            if (this.empregados[this.livre] == null) {
                this.empregados[this.livre] = f;
                this.livre++;
            }
        }
    }*/
    void adiciona(Funcionario f) {
        for (Funcionario x : this.empregados) {
            if (x == null) {
                this.empregados[this.livre] = f;
                this.livre++;
                break;
            }
        }
    }
}

ou você muda seu for para um outro tipo de for que percorre todas as casas do Array assim:

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

Espero ter conseguido te explicar, qualquer duvida só perguntar novamente.

A primeira solução proposta pelo Filipe é mais interessante que a segunda.

Na primeira solução a complexidade é O(1), já na segunda a complexidade é O(n).

Obrigado Filipe!

Fico feliz de ter conseguido te ajudar, qualquer duvida é só perguntar aqui no fórum, estamos aqui pra tentar ajudar!