Usando GregorianCalendar con SimpleDateFormat

Así que he estado atormentando mi cerebro con este ejercicio simple (debería ser) para hacer que el programa convierta una cadena de fecha en un objeto GregorianCalendar, formatee y regrese de nuevo como una cadena cuando haya terminado.

Este es el último poco de un programa que toma una porción de texto de un archivo, lo divide en registros individuales, luego divide los registros en datos individuales y los asigna a un objeto de persona.

He comprobado el código en varios lugares y el código hace exactamente lo que se supone que debe hacer hasta que llame a la función de formato, que lanza una excepción IllegalArgumentException. Al objeto GergorianCalendar se le asignan los valores que se supone que debe asignar (aunque imprimirlo es, de nuevo, otra historia como se ve a continuación ...), pero el formato no aceptará el objeto para el formateo.

Desafortunadamente, el instructor no estaba muy seguro de cómo usar el GregorianCalendar y SimpleDateFormat (aún nos asignó a trabajar con ellos) y dijo "Solo buscalo en Google" ... Lo intenté y nada de lo que encontré me ayudó.

El código que tengo hasta ahora es:

public class DateUtil {

    public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException{

        // this actually works, got rid of the original code idea
        String[] splitDate = dd_mm_yy.split("-");
        int days = Integer.parseInt(splitDate[0]);
        int month = Integer.parseInt(splitDate[1]);
        int year = Integer.parseInt(splitDate[2]);

        // dates are going in right, checked in print statement,
        // but the object is not getting formatted...
        GregorianCalendar dateConverted = new GregorianCalendar(year, month, days);
        format(dateConverted);
        return dateConverted;
    }

    public static String format(GregorianCalendar date){

        SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
        String dateFormatted = fmt.format(date);
        return dateFormatted;
    }
}

El error que recibo es:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object >as a Date

    at java.text.DateFormat.format(DateFormat.java:281)
    at java.text.Format.format(Format.java:140)
    at lab2.DateUtil.format(DateUtil.java:26) 
    at lab2.DateUtil.convertFromDMY(DateUtil.java:19)
    at lab2.Lab2.createStudent(Lab2.java:75)
    at lab2.Lab2.main(Lab2.java:34)

Y otra cosa, ¿estoy usando el calendario gregoriano, verdad? Cuando imprimo el valor de ese objeto (¿debería ser una fecha correcta?) Recibo esto:

java.util.GregorianCalendar [time = ?, areFieldsSet = false, areAllFieldsSet = false, lenient = true, zone = sun.util.calendar.ZoneInfo [id = "America / Vancouver", offset = -28800000, dstSavings = 3600000, useDaylight = true, transitions = 189, lastRule = java.util.SimpleTimeZone [id = America / Vancouver, offset = -28800000, dstSavings = 3600000, useDaylight = true, startYear = 0, startMode = 3, startMonth = 2, startDay = 8, startDayOfWeek = 1, startTime = 7200000, startTimeMode = 0, endMode = 3, endMonth = 10, endDay = 1, endDayOfWeek = 1, endTime = 7200000, endDayInfent yEcontrolVistaEcontrolVista de la vida AÑO = 1985, MES = 4, SEMANA_OF_YEAR =? SEMANA_OF_MONTH =? DAY_OF_MONTH = 22, DAY_OF_YEAR =? DAY_OF_Entrado_EJP_JP_JP_JP_JP_JP_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CONK_IN_CON_CONK 0, MILLISECOND = ?, ZONE_OFFSET = ?, DST_OFFSET =?]

Los valores de year, month y day_of_month son todos correctos, ya que son los números que pasé para crearlo.

Pensamientos, sugerencias, ¿estoy incluso cerca?

editar

los problemas originales se aclararon (¡gracias assylias!) pero todavía no puedo imprimir correctamente porque las dos funciones no están vinculadas y los requisitos son tener un valor de fecha de GregorianCalendar impreso desde el objeto person (ya que la fecha de nacimiento es un GregorianCalendar).

Código actualizado:

public class DateUtil {

    static SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");

    public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException{

        // this actually works, got rid of the original code idea
        String[] splitDate = dd_mm_yy.split("-");
        int days = Integer.parseInt(splitDate[0]);
        int month = (Integer.parseInt(splitDate[1]) - 1);
        int year = Integer.parseInt(splitDate[2]);

        // dates go in properly
        GregorianCalendar dateConverted = new GregorianCalendar(year, month, days);
        String finalDate = format(dateConverted);
        return ;
    }

    public static String format(GregorianCalendar date) throws ParseException{

       fmt.setCalendar(date);
        String dateFormatted = fmt.format(date.getTime());
        System.out.println(dateFormatted);
        return dateFormatted;
    }

}

última edición

Ok, parece que soy un idiota y NO NECESITO vincular las dos funciones de DateUtil juntas, sino usarlas en tándem. Primero, convierta la fecha de nacimiento a un calendario gregoriano y guárdelo en el objeto persona. Luego, en la declaración de impresión, simplemente diga al programa que formatee esa fecha a medida que se imprime. Problema fue resuelto. Todo funciona según las especificaciones ahora, y me siento tan estúpido porque estuve sacudiéndome como un pez fuera del agua durante el último día, más o menos, con la clase DateUtil, tratando de hacer que trabajen al mismo tiempo.

¡Gracias por la ayuda para que la fecha entre correctamente!

Respuestas a la pregunta(5)

Su respuesta a la pregunta