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

Qual o erro no meu código?

Quando eu tento rodar a classe TestaEmpresa aparece esse erro:

Exeption in thread "main" java.lang.NullPointerException
        at Funcionario.mostra(Funcionario.java:81)
        at Empresa.mostraTodasAsInformacoes(Funcionario.java:185)
        at TestaEmpresa.main(Funcionario.java:220)

Código:

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

    private static int proximoFuncionario = 0;
    private int identificador;

    public Funcionario() {}

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


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

    public int getIdendificador(){
        return this.identificador;
    }


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

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

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

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

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

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

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

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

    public Data getDataEntrada(){
        return this.dataEntrada;
    }

    public void setDataEntrada(Data dataEntrada){
        this.dataEntrada = dataEntrada;
    }

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

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

    public void mostra(){
        System.out.println("Nome do funcionario: "+ this.nome);
        System.out.println("Departamento: "+ this.departamento);
        System.out.println("Salario atual: " + this.salario);
        System.out.println("Data de entrada: "+ this.dataEntrada.getFormatada());
        System.out.println("RG: "+this.rg);
        System.out.println("Ganho anual: "+ this.getGanhoAnual());
        System.out.println("");

    }
}
//////////////////////////////////////////////////////////

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

    void preencheData(int dia, int mes, int ano){
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }

    public Data() {}

    public Data(int dia, int mes, int ano){
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;

        if(!isDataViavel(dia, mes, ano)){
            System.out.println("A data "+ getFormatada() +" não existe!");
        }

    }

    private boolean isDataViavel(int dia, int mes, int ano){
        if(dia <= 0 || mes <= 0){
            return false;
        }

        int ultimoDiaDoMes = 31;
        if(mes == 4 || mes == 6 || mes == 9 || mes == 11){
            ultimoDiaDoMes = 30;
        }else if(mes == 2){
            ultimoDiaDoMes = 28;
            if((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))){
                ultimoDiaDoMes = 29;
            }
        }
        if(dia > ultimoDiaDoMes){
            return false;
        }
        return true;
    }

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


//////////////////////////////////////////////////////////////

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

    public void setNomeEmpresa(String nomeEmpresa){
        this.nomeEmpresa = nomeEmpresa;
    }

    public String getNomeEmpresa(){
        return this.nomeEmpresa;
    }



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

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

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

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

    public void mostraEmpregados(){
        for(int i = 0; i < this.livre; i++){
            System.out.println("Funcionario na posição: "+i);
            System.out.println("R$" + this.empregados[i].getSalario());
        }
    }

    public void mostraTodasAsInformacoes(){
        for(int i = 0; i < this.livre; i++){
            this.empregados[i].mostra();
        }
    }

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

        }
        return false;
    }
}

//////////////////////////////////////////////////////////////////////////////

class TestaEmpresa{
    public static void main(String[] args){
        Empresa empresa = new Empresa("123456789", 10);
        empresa.setNomeEmpresa("IBM");


        Funcionario f1 = new Funcionario();
        f1.setNome("Joao");
        f1.setDepartamento("TI");
        f1.setSalario(800.0);

        Data data1 = new Data(25,03,2016);

        f1.setRg("123456789");

        empresa.adiciona(f1);


        empresa.mostraTodasAsInformacoes();

    }
}
3 respostas
solução!

Oi Fabio,

Acho que o problema está acontecendo porque no seu main você criou a data mas não setou ela no funcionario.

faltou essa linha:

f1.setDataEntrada(data1);

O código do main então deve ficar assim:

public static void main(String[] args){
        Empresa empresa = new Empresa("123456789", 10);
        empresa.setNomeEmpresa("IBM");


        Funcionario f1 = new Funcionario();
        f1.setNome("Joao");
        f1.setDepartamento("TI");
        f1.setSalario(800.0);

        Data data1 = new Data(25,03,2016);

        //linha que estava faltando:
        f1.setDataEntrada(data1);

        f1.setRg("123456789");

        empresa.adiciona(f1);


        empresa.mostraTodasAsInformacoes();

    }

Bons estudos!

Cara tu tem um vetor de 10 objetos(empregados) e tu quer mostrar todos eles, mas tu ta criando somente um objeto(Funcionário) que ocupara a posição no índice 0 desse vetor. Quando tu chamar o método mostraTodasAsInformacoes vai dar erro, pois só um índice desse vetor está apontando para um endereço de memória, os outros estão nulos(null).

Deu certo Rodrigo, Obrigado!