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

Java 1 Aula 03/Exercício 2- Exception in thread "main" java.lang.NullPointerException

Olá,

Estou fazendo o fazendo o exercício 2 mas criando o atributo depto da Classe Funcionário com base na Classe de Departamento. Compilo o arquivo sem erro mas na hora de executar a classe TestaFuncionario é exibido o erro abaixo:

Exception in thread "main" java.lang.NullPointerException

Onde está o erro?

Segue código abaixo:


class Departamento {
    int codigo = 0;
    String descricao;
}

class Funcionario {
    String nome;
    Departamento depto;
    double salario;
    String admissao;
    String rg;


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

    // Calcula ganho anual
    double calculaGanhoAnual(){
        return this.salario * 12;
    }
}

class TestaFuncionario {
    public static void main(String[] args) {
        Funcionario f1 = new Funcionario();


        f1.nome = "Hugo";
        f1.depto.codigo = 1;
        f1.depto.descricao = "Financeiro";


        f1.salario = 100;
        f1.recebeAumento(50);

        System.out.println("Salario Atual: " + f1.salario);
        System.out.println("Ganho Anual: " +  f1.calculaGanhoAnual());
    }
}
3 respostas

Olá Edmar,

O erro provavelmente está aqui:

f1.depto.codigo = 1;

A variável "Departamento depto" precisa ser inicializada. O valor padrão para ela é "null". E agora o que fazer? Inicialize ela antes de usá-la:

f1.depto = new Departamento();
f1.depto.codigo = 1;

Espero ter ajudado.

solução!

Oi Edmar, tudo bem?

Lembra que tudo no java é referencia ?

O que acontece é, seu objeto Funcionário quando é criado, gera uma referencia na memória, lá os atributos vão ter seu valores, tudo que for do tipo primitivo, vai ter o valor padrão, por exemplo para int o valor padrão é 0, assim como double é 0.0 mas quando falamos de referencias, ou seja, quando temos um atributo que é um objeto, por exemplo String, o valor padrão será nulo.

O que tá ocorrendo, é que você está usando a classe Departamento, como você não atribuiu valor a ele e você tenta mexer com um atributo de uma referência nula, gera para você um NullPointerException

Para resolver esse problema você precisa criar esse objeto :


class TestaFuncionario {
    public static void main(String[] args) {
        Funcionario f1 = new Funcionario();

    f1.depto = new Departamento();
        f1.nome = "Hugo";
        f1.depto.codigo = 1;
        f1.depto.descricao = "Financeiro";


        f1.salario = 100;
        f1.recebeAumento(50);

        System.out.println("Salario Atual: " + f1.salario);
        System.out.println("Ganho Anual: " +  f1.calculaGanhoAnual());
    }
}

Abraços

Obrigado Matheus, funcionou! Eu pensava que só pelo fato de iniciar

Funcionario f1 = new Funcionario();

já iniciaria tudo que "contém" nele, mas na verdade eu devo inciar "cada nível" né.

Também fiz um teste criando class Funcionário e já inicializando o atributo depto conforme abaixo:

class Funcionario {
    String nome;
    Departamento depto = new Departamento();
    double salario;
    String admissao;
    String rg;

Também funcionou dessa forma.

Obrigado.