Dúvidas, lógica em Java, tratamento de exceção para inconsistências em Data!

Boa noite, estou com um exercício da faculdade e estou com dificuldades na implementação em uma parte do código:

Exercício:

Crie a classe Data conforme especificado abaixo:
Data

  • dia: int
  • mes: int
  • ano: int
  • Data()
  • Data(int d, int m, int a)
  • entraDia(int d)
  • entraMes(int m)
  • entraAno(int a)
  • entraDia()
  • entraMes()
  • entraAno()
  • retDia(): int
  • retMes(): int
  • retAno(): int
  • mostra1(): String
  • mostra2(): String
  • bissexto(): boolean
  • diasTranscorridos(): int
  • apresentaDataAtual ():void

 O construtor Data() deverá permitir ao usuário digitar os valores de dia, mês e ano e com eles
inicializar os atributos da classe. Os valores digitados deverão ser consistidos e só aceitos se válidos,
caso contrário, redigitar;
 O construtor Data(int d, int m, int a) deverá receber os valores de dia, mês e ano e com eles inicializar
as propriedades da classe;
 Os métodos entraDia(int d), entraMes(int m) e entraAno(int a) devem receber um valor e atribuí-lo às
respectivas propriedades;

 Os métodos entraDia (),entraMes () e entraAno () devem permitir ao usuário digitar um valor e atribuí-
lo a respectiva propriedade. Os valores digitados devem sofrer consistência e só aceitos quando válidos,

caso contrário, solicitar ao usuário redigitar;
 Os métodos retDia(), retMes() e retAno() devem nos devolver as respectivas propriedades;
 O método mostra1() deve nos devolver a data no formato: dd/mm/aaaa;
 O método mostra2() deve nos devolver a data no formato: dd/mesPorExtenso/ano;
 O método bissexto() deve nos devolver um boolean informando se o ano é ou não bissexto;
 O método diasTranscorridos, deve retornar a quantidade de dias transcorridos no ano até a data
digitada.
 O método apresentaDataAtual() deve imprimir a data atual, utilizando as classes Date e DateFormat, o
DateFormat empregando o seguinte método: getDateInstance(DateFormat.FULL);
 Conveniente colocar tratamento de exceção para as possíveis inconsistências na entrada de dados.

meu código:
package data;
import java.text.DateFormat;
import java.util.Scanner;
import java.util.Date;

public class Data {
Scanner sc = new Scanner(System.in);

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

public Data(){        
    do{
    System.out.println("Digite o ano: (0~2019): ");
    ano = sc.nextInt();              
    }while(ano <0 || ano > 2019);         
    
    do{
    System.out.println("Digite o mes: (1~12): ");
    mes = sc.nextInt();                
    }        
    while(mes <1 || mes>12);
    
    do{
    if(mes == 2){
        System.out.println("Digite o dia: (1~29");
        dia = sc.nextInt();
    }
    while(dia < 1 || dia > 29);

    

public Data(int d, int m, int a){
    this.dia = d;        
    this.mes = m;
    this.ano = a;
}

public void entraDia(int d){
    this.dia = d;
}
public void entraMes(int m){
    this.mes = m;
}
public void entraAno(int a){
    this.ano = a;
}

public void entraDia(){
    do{
        System.out.println("Digite o dia: (1~30)");
        dia = sc.nextInt();
    }
    while(dia <1 || dia > 30);
}

public void entraMes(){
    do{
        System.out.println("Digite o mes: (1~12)");
        mes = sc.nextInt();
    }
    while(mes <1 || mes > 12);
}

public void entraAno(){
    do{
        System.out.println("Digite o ano: (0~2019)");
        ano = sc.nextInt();
    }
    while(dia <0 || dia > 2019);
}

public int retDia(){
    return dia;
}

public int retMes(){
    return mes;
}

public int retAno(){
    return ano;
}

public String mostra1(){
   String A = (this.dia+":"+this.mes+":"+this.ano);
    return A;
}
public String mostra2(){
    String mes;
    String dia;
    String ano;
    
    if(this.mes == 1){ mes = "Janeiro";}
    else if(this.mes == 2){ mes = "Fevereiro";}
    else if(this.mes == 3){ mes = "Março";}
    else if(this.mes == 4){ mes = "Abril";}
    else if(this.mes == 5){ mes = "Maio";}
    else if(this.mes == 6){ mes = "Junho";}
    else if(this.mes == 7){ mes = "Julho";}
    else if(this.mes == 8){ mes = "Agosto";}
    else if(this.mes == 9){ mes = "Setembro";}
    else if(this.mes == 10){ mes = "Outubro";}
    else if(this.mes == 11){ mes = "Novembro";}
    else { mes = "Dezembro";}
    
    
    if(this.dia < 10){ dia = "0"+this.dia;}        
    else{ dia = ""+this.dia; }
    
    if(this.ano < 10){ ano = "000"+this.ano;}
    else if(this.ano < 100){ ano = "00"+this.ano;}        
    else{ ano = ""+this.ano;}
   
        
    return dia+"/"+mes+"/"+ano;
    
}

public boolean bissexto(){
    if ( ( ano % 4 == 0 && ano % 100 != 0 ) || ( ano % 400 == 0 ) ){
        return true;
    }
    else{
        return false;
    }
}

public int diasTranscorridos(){
    int diastrans = 0;        
      
        switch (this.mes) {
             case 3: case 5:
            case 7: case 8: case 10:
            case 12:
            diastrans += 31;
            break;
            case 4: case 6: case 9: case 11:
            diastrans += 30;
            break;
            case 2:
            diastrans += 28;
            break;
        }
        
        diastrans += this.dia;       
     if (bissexto() == true && this.mes > 2 ){ 
         diastrans += 1;
    }
     return diastrans;        

}

public void apresentaDataAtual(){
    Date data = new Date();
    
    System.out.println("Data atual: "+ DateFormat.getDateInstance(DateFormat.FULL).format(data));
}

public static void main(String[] args) {
    TestaData teste = new TestaData();
    teste.Teste();
    
}

}

a minha dificuldade esta no tratamento de exceções com relação aos dias que o usuário pode inserir

public Data(){
do{
System.out.println("Digite o ano: (0~2019): ");
ano = sc.nextInt();
}while(ano <0 || ano > 2019);

    do{
    System.out.println("Digite o mes: (1~12): ");
    mes = sc.nextInt();                
    }        
    while(mes <1 || mes>12);
    
    do{
    if(mes == 2){
        System.out.println("Digite o dia: (1~29");
        dia = sc.nextInt();
    }
    while(dia < 1 || dia > 29);

não estou conseguindo implementar nenhuma lógica para que ele possa digitar apenas dias entre 1 e 30 nos meses Abril, Junho, Setembro e Novembro, principalmente com relação á Fevereiro, se alguém puder me dar uma luz, agradeço!

resolvido

Amigo, poste o código para ajudar outros usuários.