4
respostas

Aula 05 - Como utilizar atributos de outras classes

Na aula 05, aprendemos a implementar os atributos com modificadores de acesso, porém desde que adicionei o atributo static nos objetos da classe Funcionário, todos os métodos da classe Empresa que fazem uso de algum objeto da classe Funcionário não funcionam mais. Como posso resolver este problema?

Como a classe Funcionário está montada:

class Funcionario {

    private String nomeCompleto, deptoTrabalho, rg, cpf;
    private double salario;
    private DataInicio dataInicio;
    private int matricula;
    private static int identificador;

    public Funcionario (){
        this.matricula = ++identificador;        
    }
    /*outros métodos*/
}

Erro apresentado pela IDE (NetBeans 8.2)

Exception in thread "main" java.lang.NullPointerException
    at funcionario.Empresa.adicionarFuncionario(Empresa.java:65)
    at funcionario.Teste.main(Teste.java:19)
C:\Users\logofar\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)

Vale citar que todos os métodos presentes na classe Funcionário funcionam como deveriam, e todos os objetos tem getters e setters

4 respostas

Oi Leonardo, tudo bem?

Tem como você postar o código da classe Empresa e Funcionário também?

Claro! Classe Funcionário:

class Funcionario {

    private String nomeCompleto, deptoTrabalho, rg, cpf;
    private double salario;
    private DataInicio dataInicio;
    private int matricula;
    private static int identificador;

    /*exibe o nome do funcionário*/
    public String getNomeCompleto(){
        return this.nomeCompleto;
    }

    /*recebe o nome do funcionário*/
    public void setNomeCompleto (String nomecompleto){
        this.nomeCompleto = nomecompleto;
    }

    /*exibe o depto em que o funcionario trabalha*/
    public String getDeptoTrabalho(){
        return this.deptoTrabalho;
    }

    /*recebe o depto em que o funcionario trabalha*/
    public void setDeptoTrabalho (String deptotrabalho){
        this.deptoTrabalho = deptotrabalho;
    }

    /*exibe o CPF do funcionario*/
    public String getCpf(){
        return this.cpf;
    }

    /*erecebe o CPF do funcionario*/
    public void setCpf (String cpf){
        this.cpf = cpf;
    }

    /*exibe o RG do funcionario*/
    public String getRg(){
        return this.rg;
    }

    /*recebe o RG do funcionario*/
    public void setRg (String rg){
        this.rg = rg;
    }

    /*exibe a data em que o funcionario comecou a trabalhar na empresa*/
    public DataInicio getDataInicio(){
        return this.dataInicio;    
    }

    /*recebe a data em que o funcionario comecou a trabalhar na empresa*/
    public void setDataInicio(DataInicio dataInicio){
        this.dataInicio = dataInicio;    
    }

    /*exibe o salario do funcionario*/
    public double getSalario(){
        return this.salario;
    }

    /*recebe o salario do funcionário*/
    public void setSalario (double salario){
        this.salario = salario;
    }

    /*aumento de salário*/
    public void aumento(double aumento){
        salario += aumento;
    }

    /*calculo do salario anual*/
    public double getSalarioAnual(){
        return (this.salario * 12);
    }

    /*mostra o numero de matricula do funcionario*/
    public int getMatricula(){
        return this.matricula;
    }

    /*mostra todos os atributos do funcionario*/
    public void mostra(){
        System.out.println("Nome Completo: " + this.nomeCompleto);
        System.out.println("CPF.: " + this.cpf);
        System.out.println("RG.: " + this.rg);
        System.out.println("Departamento: " + this.deptoTrabalho);
        System.out.println("Salário Atual: " + this.salario);
        System.out.println("Salário Anual: " + String.format("%.2f", this.getSalarioAnual()));
        System.out.println("Data de Inicio: " + this.dataInicio.dataFormatada());    }
}

Classe Empresa

class Empresa {
    private String nome, cnpj, endereco;
    private Funcionario[] funcionario;
    private int livre = 0;

    /*exibe o nome da empresa*/
    public String getNome(){
        return this.nome;
    }

    /*recebe o nome da empresa*/
    public void setNome(String nome){
        this.nome = nome;
    }

    /*exibe o CNPJ da empresa*/
    public String getCnpj(){
        return this.cnpj;
    }

    /*recebe o CNPJ da empresa*/
    public void setCnpj(String cnpj){
        this.cnpj = cnpj;
    }

    /*exibe o endereço da empresa*/
    public String getEndereco(){
        return this.endereco;
    }

    /*recebe o endereco da empresa*/
    public void setEndereco(String endereco){
        this.endereco = endereco;
    }

    /*mostra um funcionário específico, conforme posição apontada*/
    public Funcionario getFuncionario(int i){
        return this.funcionario[i];
    }

    /*mostra todos os atributos de todos os funcionarios*/
    public void listaDeFuncionarios(){
        for (int i = 0; i < this.funcionario.length; i++){
            Funcionario funcionario = this.funcionario[i];
            if(funcionario == null) continue;
            System.out.println("Funcionario nº: " + (i+1));
            this.funcionario[i].mostra();
        }
    }

    /*confirma se um funcionário está ou não listado na empresa*/
    public boolean contem(Funcionario f){
        for (int i = 0; i < this.funcionario.length; i++){
            if (f == this.funcionario[i]){
                return true;
            }
            return false;
        }
    }

    /*adiciona um novo funcionario*/
    public void adicionarFuncionario(Funcionario f){
        this.funcionario[this.livre] = f;
        this.livre++;        
    }

}

Tem como postar sua classe Teste também?

Leonardo, quando você define um método ou atributo como static, todos os outros métodos que o utilizam também devem ser static. Para facilitar seus debugs, crie seus códigos com try/catch, desta forma o proprio java te dará as informações do erro.