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

Data não está validando

Em um dos exercícios, é pedido que seja criado um método que valide a data, para evitar datas inexistentes como 31/02/2017. Eu tentei fazer um método, e depois corrigi para o do professor, mas continua deixando entrar datas inválidas.

class Funcionario {

    private String nome;
    private String departamento;
    private String rg;
    private double salario;
    private Data dataDeEntrada;

    // Início getters e setters de atributos
    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 String getRg() {
        return this.rg;
    }

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

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

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

    public Data getDataDeEntrada() {
        return this.dataDeEntrada;
    }

    public void setDataDeEntrada(int dia, int mes, int ano) {
        this.dataDeEntrada = new Data(dia, mes, ano);
        this.dataDeEntrada.getFormatada();
    }
    // Fim getters e setters de atributos


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

    public Funcionario() {

    }


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


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


    public void mostra() {
        System.out.println("Nome: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("Data de admissao: " + this.dataDeEntrada.getFormatada());
        System.out.println("RG: " + this.rg);
        System.out.println("Salário: " + this.salario);
        System.out.println();
        System.out.println("Ganho anual: " + this.getGanhoAnual());
    }
}
class Data {

    private int    dia;
    private int mes;
    private int ano;

    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; // por padrao são 31 dias
        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;
    }

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

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

    public static void main(String[] args) {

        Funcionario f = new Funcionario();

        f.setNome("Jean");
        f.setDepartamento("T.I.");
        f.setRg("MG-12.345.678");
        f.setSalario(800.0);
        f.setDataDeEntrada(31, 2, 2013); //Essa data não deveria ser aceita, porém ao compilar e rodar, o método abaixo mostra essa data.

        f.mostra();        
    }
}

Como corrigir?

3 respostas

É exibido o print de validação da data? Acredito que a validação esteja correta , porém uma validação mais elaborada deveria lançar uma exceção neste ponto

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

ao invés de um print na tela

throw new IllegalArgumentException("A data " + getFormatada() + " não existe!")

o assunto de exceptions será abordado em outros cursos.

solução!

Bom dia Jean,

O método faz a validação corretamente, e printa no console que a data não é válida, e o objetivo neste exercício era esse mesmo.

Se o seu interesse é que após está validação, você não aceite usar a data, bastaria zerar os valores dos atributos dia, mes e ano, por exemplo. Existe várias formas para chegar no resultado que você quer.

Nos próximos cursos você aprenderá formas mais ideias de tratar situações como estas, utilizando o controle de fluxo através de exceções.

Se preferir deixe este código guardado, e quando tiver aprendido Exceptions você volta nele e faz as alterações necessárias para se comportar como você deseja.

Abraço.

Entendi, Emerson.

Vou seguir os cursos então, muito obrigado!