[Resolvido] Como garantir que datas como 31/2/2012 não sejam aceitas pela sua classe Data?

Estou tentando fazer o teste para que datas como 31/2 não sejam aceitas, mas não consigo fazer com que o método que valida a data seja testado dentro do método que formata a data.

class Data {
	int dia;
	int mes;
	int ano;
	
	public boolean dataValida(int d, int m, int a) {
		if (d > 31) return false;
		if (m > 12) return false;
		if ((m == 4 || m == 6 || m == 9 || m == 11) && (dia > 30)) {
			return false;
		}
		if (m == 2) {
			if (bissexto (a)) {
				if (d > 29) return false;
			} else {
				if (d > 28) return false;
			}
			
		} return true;
	}
	
	boolean bissexto (int a) {
		return (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0));
	}

	String formatada() {
		if(this.dataValida() == false) {
			return ("Data Inválida");
		} else {
			String d = this.dia + "/" + this.mes + "/" + this.ano;
			return d;
		}
	}
}

E se vc adicionar o seguinte IF:

if ((m == 2 && d > 29) { // Se o dia for inválido para o mês de fevereiro
	return false;
}

EDIT
Ih, foi mal, agora que reparei que já tem essa verificação. Então não entendi o problema.

Se estiver trabalhando com tempo, de uma pesquisada sobre a classe LocalDateTime, que quebra um galho enorme. Com ela vc pode tbm pedir pra retornar um momento - de segundos a anos - específico. Relaxe, pra coisas assim nós programadores nao precisamos sofrer… vendo se tem alguma Biblioteca, Framework, etc, que faça as partes chatas/complicadas/desnecessárias/difíceis, a menos que queira reinventar a roda… :), então nesse caso veja se isso funciona: esse cálculo de bissexto, ou passando um parâmetro nesse this.dataValida ().

Como @Laio falou, use LocalDate que já vem tudo pronto, nao precisa perder tempo com isso. Exemplo pra ilustrar:

    public boolean dataValida(String dataIso) {
        try {
            LocalDate.parse(dataIso); //pode passar por parametro outro formato caso queira
        } catch (DateTimeParseException e) {
            return false;
        }
        return true;
    }
if (!dataValida("2020-02-31")) {
...
}

Obrigado, vou testar!

Obrigado! Na realidade este é um exercício que estou fazendo da apostila do Caelum, ela pede que você não permita que dadas como 31/02 sejam aceitas, e precisa ser feito sem utilizar classes prontas! O erro que esta dando é nesta linha "if(this.dataValida() == false) ", pois como tive de criar a formatada() como String, ele não está aceitando o teste utilizando um boolean. Sou iniciante, desculpe não saber explicar bem.

Você está chamando um método que necessita de parâmetros.

Eu estou passando estes parâmetros por outra classe.

Qual outra classe?

public class BancoExe5_8 {
public static void main(String[] args) {
Conta c = new Conta(“Rinaldo”,2000);
c.setData (20, 03, 2020);

	Conta c1 = new Conta("Alessandra",3500);
	c1.setData (30, 02, 2020);
	
	c.deposita(150);
	c1.deposita(300);
	
	System.out.println(c.dadosParaImpressao());
	System.out.println(c1.dadosParaImpressao());

}

}

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

public boolean dataValida(int d, int m, int a) {
	if (d > 31) return false;
	if (m > 12) return false;
	if ((m == 4 || m == 6 || m == 9 || m == 11) && (dia > 30)) {
		return false;
	}
	if (m == 2) {
		if (bissexto (a)) {
			if (d > 29) return false;
		} else {
			if (d > 28) return false;
		}
		
	} return true;
}



boolean bissexto (int a) {
	return (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0));
}


String formatada() {
	if(this.dataValida() == false) {
		return ("Data Inválida");
	} else {
		String d = this.dia + "/" + this.mes + "/" + this.ano;
		return d;
	}
}

}

Não é assim.
Veja. Você criou dois objetos c e c1 instanciando a Classe Conta.
Chamou o método setData passando parâmetros para os atributos da classe, mas não chamou o método dataValida repassando os valores que atribuiu.
O erro no this.dataValida() == false é justamente porque não tem o preenchimento dos argumentos no método.

Valeu Trapezus, funcionou agora! Obrigado!

Obrigado!