5
respostas

Java Aula 6 - Métodos Construtores

Bom dia, apesar do NetBeans não marcar nenhum erro, na hora de compilar aparece a seguinte mensagem:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at empresa_funcionario.Empresa.adiciona(Empresa.java:33) at empresa_funcionario.Alura.main(Alura.java:23)

Não entendo o que há de errado. Segue o código:

public class Alura {
    public static void main(String[] args) {
        Empresa e1 = new Empresa(1);
        Funcionario[] f = new Funcionario[2];

        Funcionario f1 = new Funcionario();

        f1.setNome("Hugo");
        f1.setDepartamento("Engenharia");
        f1.setSalario(100);
        f1.setAumento(50);

        e1.adiciona(f1);

        Funcionario f2 = new Funcionario();

        f2.setNome("Diogo");
        f2.setDepartamento("Ensino");
        f2.setSalario(200);
        f2.setAumento(100);

        e1.adiciona(f2);

        e1.mostraTodosDados();

    }  
}

e a classe Empresa

package empresa_funcionario;
public class Empresa {
    private String nome;
    private Funcionario[] empregados;
    private String cnpj;

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

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

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

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

    public String getCNPJ(){
        return this.cnpj;
    }

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

    int livre = 0;
    public void adiciona(Funcionario f){
        this.empregados[this.livre] = f;
        this.livre++;
    }

    void mostraSalarios(){
       for(int i = 0; i <= this.empregados.length; i++){
            System.out.println("Funcionario na posição: " + i);
            System.out.println("Salario " + this.empregados[i].getSalario());
        }
    }

    void mostraTodosDados(){
        for(int i = 0; i < this.livre; i++){
            System.out.println("Funcionarios na posição: " + i);
            this.empregados[i].getDadosFuncionario();
        }
    }

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

}

A linha 33 que diz no erro é a seguinte: this.empregados[this.livre] = f;

do método adiciona(Funcionario f)

A linha 23, é a da classe main e1.adiciona(f2);

5 respostas

Oi Thiago, olhe o método mostraTodosDados. nele tem um um for com essa assinatura for(int i = 0; i <= this.empregados.length; i++). Veja que nesse momento o this.empregados.length tem tamanho 2, então enquanto esse i for menor ou igual a 2 o laço vai continuar. O que acontece quando ele tentar acessar a posição 2 do Array? Lembre-se que o índice do Array começa em 0. Dá uma pensada e tenta resolver, se não rolar avisa aqui.

Este método deveria ler apenas a quantidade de funcionários.

O erro está neste método? Não entendi...

Oi Thiago,

Eu acho que o problem é, voce tem a variavel int livre = 0; e no metodo mostraTodosDados voce tem no

  for(int i = 0; i < this.livre; i++){

quando o livre é 0 esse for dá erro pois i=0 e i < 0 da erro experimenta colocar um = nesse for

Espero ter ajudado.

Mesmo erro...

:(

void mostraTodosDados(){
        for(int i = 0; i <= this.livre; i++){
            if(this.empregados[i] == null) continue;
            System.out.println("Funcionarios na posição: " + i);
            this.empregados[i].getDadosFuncionario();
        }
    }

Oi Thiago, olhei a parte errada do seu código rsrs. No momento seu Array não tem tamanho nenhum. Vc até criou um de tamanho 2 no seu main mas não passou ele para a classe Empresa