Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida no Ex. 2 da Aula 6 - Construtores

Estou com um problema no meu código, fiz um construtor na classe empresa conforme o enunciado do exercício, compilei a classe empresa e deu tudo certo. Na minha casse TestaEmpresa, passei o parâmetro conforme o construtor pede, compilei a classe e deu tudo certo. Porém, na hora que rodo a classe TestaEmpresa, resulta no erro que segue abaixo:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at Empresa.adiciona(Empresa.java:45) at TestaEmpresa.main(TestaEmpresa.java:16)

Não estou conseguindo encontrar o problema, gostaria de saber se alguém poderia por favor me ajudar!!!

Segue abaixo minhas classes:

class Empresa {

    private String nome;
    private String cnpj;
    private String endereco;
    private Funcionario[] empregados; //= new Funcionario[10];
    private int tamanhoDoArray = 0;
    int count = 0;

    public Empresa () {}

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

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

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

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

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

    public void setEndereco (String endereco) {
        this.endereco = endereco;
    }

    public String getEndereco () {
        return this.endereco;
    }

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

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

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

    public void mostraTodasAsInformacoes() {
        for (int i = 0; i < this.empregados.length; i++) {
            if (this.empregados[i] != null) {
                System.out.println("");
                System.out.println("Funcionário na posição: " + i);
                this.empregados[i].mostra();
            }
        }
    }
}

public class Funcionario {
    private String nome;
    private String rg;
    private Data dataDaEntrada = new Data();
    private String departamento;
    private double salario; 

    public Funcionario () {
    }

    public Funcionario (String nome) {
        this.nome = nome;
    }

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

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getRg() {
        return this.rg;
    }

    public void preencheDataDaEntrada(int dia,int mes, int ano) {
        this.dataDaEntrada.imprimeData(dia, mes, ano);
    }

    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    public String getDepartamento() {
        return this.departamento;
    }

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

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

    public void setSalario(double valor) {
        this.salario = valor;
    }

    public double getSalario() {
        return this.salario;
    }


    public void mostra() {

        System.out.println("");
        System.out.println("Nome: " + getNome());
        System.out.println("RG: " + getRg());
        System.out.println("Departamento: " + getDepartamento());
        System.out.println("Salário R$: " + getSalario());
        System.out.println("Ganho Anual: " + getGanhoAnual());
        System.out.println("Data de entrada: " + this.dataDaEntrada.getFormatada());

    }
}

class Data {

    int dia;
    int mes;
    int ano;

    void imprimeData (int dia, int mes, int ano){

        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }
    String getFormatada() {
        return this.dia + "/" + this.mes + "/" + this.ano;

    }
}

class TestaEmpresa {

    public static void main (String [] args) {

        Empresa empresa = new Empresa(10);


            Funcionario f = new Funcionario("Vitor Camargo");
            f.setRg ("25.889.335-2");
        f.setDepartamento ("RH");
        f.setSalario (1000);
        f.preencheDataDaEntrada (5,7,2015);
               empresa.adiciona (f);

        Funcionario f1 = new Funcionario("Carlos Augusto dos Santos");
        f1.setRg ("478.886.345-7");
        f1.setDepartamento ("SME");
        f1.setSalario (3000);
        f1.preencheDataDaEntrada (12,8,2010);
        empresa.adiciona(f1);


        empresa.getFuncionario(0).mostra();

        empresa.getFuncionario(1).mostra();        

    }
}
3 respostas
solução

Olá Diego! O erro está sendo gerado devido a um erro em seu construtor e na sua classe Empresa. O construtor de sua classe Empresa está pondo o tamanho da Array de Funcionarios como 0, isso porque ao invés de você estar utilizando o parametro passado no construtor você está utilizando o atributo da classe tamanhoDoArray. Veja só:

private int tamanhoDoArray = 0;

    public Empresa (int tamanhoDoArray){
        this.empregados = new Funcionario [this.tamanhoDoArray]; //Aqui você está utilizando o atributo da classe que guarda o valor 0.
    }

O Correto seria está da seguinte forma:

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

Espero ter ajudado! Bons Estudos!

Muito obrigado Romário, deu certo!!!

TEnho uma duvida

Na classe Empresa. Eu preciso criar a variavel tamanhoDoArray ?

Ou construtor só usa dentro dela mesmo ?

public Empresa (int tamanhoDoArray){ this.empregados = new Funcionario [tamanhoDoArray]; } Aqui rodou e compilou sem declarar a variável.