1
resposta

[Dúvida] reotrna que o ano e bissexto, mesmo nao sendo

nao importa o ano que eu digite, ele sempre retorna como se fosse um ano bissexto, mesmo não sendo.

package GerenciadorDeShopping;

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

    public Data(int dia, int mes, int ano) {
        if (verificaData(dia, mes, ano)) {
            this.dia = dia;
            this.mes = mes;
            this.ano = ano;
            System.out.println("td blza");
        } else {
            System.out.println("Data inválida. Alterando para 01/01/2000.");
            this.dia = 1;
            this.mes = 1;
            this.ano = 2000;
        }
    }

    public boolean verificaAnoBissexto() {
        if(ano % 4 == 0) {
            return true;
        }else {
            return false;
        }
    }

    private boolean verificaData(int dia, int mes, int ano) {
        if(mes < 1 || mes > 12 || dia < 1) {
            return false;
        }

        int diasMes = 0;

        switch(mes) {
            case 2:
                if(verificaAnoBissexto()) {
                    System.out.println("ano recebendo 29");
                    diasMes = 29;
                } else {
                    System.out.println("ano recebendo 28");
                    diasMes = 28;
                }
                break;

            case 4:
            case 6:
            case 9:
            case 11:
                diasMes = 30;
                break;

            default: 
                diasMes = 31;
                break;
        }

        if(dia > diasMes) {
            return false;

        }return true;

    }



    public static void main(String[] args) {
        Data d1 = new Data(29, 2, 2021);


    }

}

1 resposta

Oi Camilli, tudo bem?

O que está acontecendo é mais ou menos o seguinte: ao chamar o método verificaData, a data ainda não foi criada, certo? E o Java entende que dia, mês e ano valem zero, por padrão. Com isso, ocorre um problema de escopo no seu método verificaAnoBissexto(): ele não recebe nenhum parâmetro, e entende que o ano que você está usando no método é o atributo da classe (que vale 0), e não o ano que você está passando como parâmetro no verificaData, que ainda será atribuído de verdade à data. No intellij podemos ver isso claramente:

Captura de tela do Intellij em fundo cinza escuro com letras coloridas, e os métodos verificaAnoBissexto e verificaData

Repare que ele usa a cor roxinha pra representar o atributo da classe, ao invés de usar branco, pra indicar um parâmetro. Já no método verificaData, o ano está mais claro que o restante. Isso acontece porque em tese o parâmetro não está sendo usado.

Para corrigir isso, você pode usar um parâmetro no seu método verificaAnoBissexto:

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

    public Data(int dia, int mes, int ano) {
        if (verificaData(dia, mes, ano)) {
            this.dia = dia;
            this.mes = mes;
            this.ano = ano;
            System.out.println("td blza");
        } else {
            System.out.println("Data inválida. Alterando para 01/01/2000.");
            this.dia = 1;
            this.mes = 1;
            this.ano = 2000;
        }
    }

    public boolean verificaAnoBissexto(int ano) {
        if(ano % 4 == 0) {
            return true;
        }else {
            return false;
        }
    }

    private boolean verificaData(int dia, int mes, int ano) {
        if(mes < 1 || mes > 12 || dia < 1) {
            return false;
        }

        int diasMes = 0;

        switch(mes) {
            case 2:
                if(verificaAnoBissexto(ano)) {
                    System.out.println("ano recebendo 29");
                    diasMes = 29;
                } else {
                    System.out.println("ano recebendo 28");
                    diasMes = 28;
                }
                break;

            case 4:
            case 6:
            case 9:
            case 11:
                diasMes = 30;
                break;

            default:
                diasMes = 31;
                break;
        }

        if(dia > diasMes) {
            return false;

        }return true;

    }



    public static void main(String[] args) {
        Data d1 = new Data(29, 2, 2021);


    }

}

Espero ter ajudado! Caso tenha ficado alguma dúvida com a explicação, fique à vontade para responder aqui, é realmente uma parte bem confusa. :)

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!