Exception werfen bei falscher Datumseingabe

nikva

Bekanntes Mitglied
Hallo Java Forum,
Ich will eine Methode schreiben, die mit Hilfe des heutigen Datums überprüft ob ein vom User angegebenes Geburtsdatum in der Zukunft liegt oder einen ungültigen Tag enthält.
Um zu überprüfen ob der Tag gültig ist hab ich folgende Methode, bei der aber aktuell jeder Tag einfach angenommen wird. Ich sehe aber iwie nicht wo mein Fehler liegt und ich hoffe, dass mir einer meinen Fehler zeigen kann:

Java:
    public static int requestBirthDay(Calendar rightNow, int birthYear, int birthMonth) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int d = 0;
        System.out.println("Geburtstag eingeben");
        try {
            try {
                d = Integer.parseInt(in.readLine());
                if (!validateDay(d, rightNow, birthYear, birthMonth)) {
                    throw new IllegalDayException();
                }
                return d;
            } catch (IllegalDayException ex) {
                System.out.println("Bitte einen gültigen Tag eingeben");
                ex.printStackTrace();
                System.out.println("");
                return requestBirthDay(rightNow, birthYear, birthMonth);
            }
        } catch (NumberFormatException | IOException e) {
            System.out.println("Bitte eine Zahl eingeben");
            e.printStackTrace();
            System.out.println("");
            return requestBirthDay(rightNow, birthYear, birthMonth);
        }
    }

    public static boolean validateDay(int day, Calendar rightNow, int birthYear, int birthMonth) {

        try {
            if (rightNow.get(Calendar.MONTH) == birthMonth && rightNow.get(Calendar.DAY_OF_MONTH) < day) {
                throw new IsFutureDateException("Tag liegt in der Zukunft");
            }
        } catch (IsFutureDateException ex) {
            System.out.println("eingegebenes Datum liegt in der Zukunft, bitte neues Datum eingeben");
            ex.printStackTrace();
            System.out.println("");
            return false;
        }
        if (day < 1 || day > 31) {
            return false;
        }

        if ((birthMonth == 4 | birthMonth == 6 | birthMonth == 9 | birthMonth == 11) && day > 30) {
            return false;
        }

        if (birthMonth == 2 && day == 29 && (birthYear % 4 != 0 && birthYear % 100 == 0)) {
            return false;

        } else {
            return true;
        }
    }
 

httpdigest

Top Contributor
Diese Zeile von dir:
Java:
if (rightNow.get(Calendar.MONTH) == birthMonth && rightNow.get(Calendar.DAY_OF_MONTH) < day) {
prüft ja auch nur den Monat und den Tag. Vielleicht solltest du auch das Jahr prüfen, oder besser: Verwende einfach die Calendar.before() Methode.
 

LimDul

Top Contributor
Musst du die Calendar API Verwenden? Mit der kannst du dich an so vielen Stellen selber in den Fuss schießen. So ist der Monat 0-basiert, das heißt der Januar ist der Monat 0 und der Dezembre der Monat 11
 

nikva

Bekanntes Mitglied
aber selbst unabhängig vom Jahr müsste ja sowas wie 20.Juni nicht gehen, aber bei mir wird das einfach angenommen.
Und ja, ich muss die Calendar api verwenden
 

nikva

Bekanntes Mitglied
Ok, ich sehe meinen Fehler jetzt doch: Ich prüfe nur ob in dem Monat selbst der Tag noch nicht gültig ist aber muss natürlich auch prüfen ob der Monat überhaupt schon gültig ist...
 

httpdigest

Top Contributor
Ich verstehe aber komplett deine Logik hier überhaupt nicht... Das heisst, ich kann nicht sagen, dass ich am 16.10. Geburtstag habe (egal, welches Jahr), weil heute der Monat erst der 6./Juni ist???
 

nikva

Bekanntes Mitglied
Ich verstehe aber komplett deine Logik hier überhaupt nicht... Das heisst, ich kann nicht sagen, dass ich am 16.10. Geburtstag habe (egal, welches Jahr), weil heute der Monat erst der 6./Juni ist???
nein, erst wird das jahr abgefragt und gecheckt ob es in der Zukunft liegt
Java:
    public static int requestBirthYear(Calendar rightNow) {
        System.out.println("Geburtsjahr eingeben:");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int y = 0;
        try {
            try {
                y = Integer.parseInt(in.readLine());
                if (rightNow.get(Calendar.YEAR) < y) {
                    throw new IsFutureDateException();
                }
                return y;

            } catch (IsFutureDateException ex) {
                System.out.println("Jahr liegt in der Zukunft, bitte neues Jahr eingeben");
                ex.printStackTrace();
                System.out.println("");
                return requestBirthYear(rightNow);
            }
        } catch (NumberFormatException | IOException e) {
            System.out.println("bitte eine Zahl eingeben");
            e.printStackTrace();
            return requestBirthYear(rightNow);
        }

    }

dann wird der Monat abgefragt und gecheckt ob er in der Zukunft des aktuellen Jahres liegt
Java:
    public static int requestBirthMonth(Calendar rightNow, int birthYear) {
        System.out.println("Geburtsmonat eingeben:");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int m = 0;
        try {
            try {
                m = Integer.parseInt(in.readLine());
                if (rightNow.get(Calendar.YEAR) == birthYear && rightNow.get(Calendar.MONTH) + 1 < m) {
                    throw new IsFutureDateException();
                }
                return m;

            } catch (IsFutureDateException ex) {
                System.out.println("Monat liegt in der Zukunft, bitte neuen Monat eingeben");
                ex.printStackTrace();
                System.out.println("");
                return requestBirthMonth(rightNow, birthYear);
            }
        } catch (NumberFormatException | IOException e) {
            System.out.println("bitte eine Zahl eingeben");
            e.printStackTrace();
            return requestBirthMonth(rightNow, birthYear);
        }

    }

und zuletzt wird der Tag abgefragt und geprüft ob der Tag in der Zukunft liegt und ob der Tag im jeweiligen Jahr existiert(schaltjahr,verschiedene monatslängen etc)
Java:
public static int requestBirthDay(Calendar rightNow, int birthYear, int birthMonth) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Geburtstag eingeben");

        try {
            try {
                int d = Integer.parseInt(in.readLine());
                if (!validateDay(d, rightNow, birthYear, birthMonth)) {
                    throw new IllegalDayException();
                }
                return d;
            } catch (IllegalDayException ex) {
                System.out.println("Bitte einen gültigen Tag eingeben");
                ex.printStackTrace();
                System.out.println("");
                return requestBirthDay(rightNow, birthYear, birthMonth);
            }
        } catch (NumberFormatException | IOException e) {
            System.out.println("Bitte eine Zahl eingeben");
            e.printStackTrace();
            System.out.println("");
            return requestBirthDay(rightNow, birthYear, birthMonth);
        }
    }

    public static boolean validateDay(int day, Calendar rightNow, int birthYear, int birthMonth) {

        try {
            if (rightNow.get(Calendar.YEAR) == birthYear && rightNow.get(Calendar.MONTH) + 1 == birthMonth
                    && rightNow.get(Calendar.DAY_OF_MONTH) < day) {
                throw new IsFutureDateException();
            }
        } catch (IsFutureDateException ex) {
            System.out.println("Tag liegt in der Zukunft, bitte neuen Tag eingeben");
            ex.printStackTrace();
            System.out.println("");
            return false;
        }
        if (day < 1 || day > 31) {
            return false;
        }

        if ((birthMonth == 4 | birthMonth == 6 | birthMonth == 9 | birthMonth == 11) && day > 30) {
            return false;
        }

        if (birthMonth == 2 && day == 29 && (birthYear % 4 != 0 && birthYear % 100 == 0)) {
            return false;

        } else {
            return true;
        }
    }

das Problem hierbei ist aber, dass ich jetzt jeden Fall abdecke, ich aber wenn ich einen Tag eingebe der in der Zukunft liegt UND ein ungültiger Tag ist(z.B 32.6.2020) 2 Exceptions werfe. Ich darf das aber nicht in einer Exception kombinieren
 
Zuletzt bearbeitet:

thecain

Top Contributor
Du solltest auch nicht unbedingt Exceptions zur Flusssteuerung verwenden.

Wieso willst du denn 2 Exceptions abdecken. Ein ungültiger Tag liegt nicht in der Zukunft, der ist ungültig und den gibts einfach nicht. Der ist nirgendwo, also auch nicht in der Zukunft.
 

LimDul

Top Contributor
btw, die Methode im Fehlerfall wieder rekursiv aufzurufen kann man machen, aber eine Steuerung über eine Schleife empfinde ich als sinnvoller.
 

nikva

Bekanntes Mitglied
Wieso willst du denn 2 Exceptions abdecken
Die aufgabenstellung schreibt eine exception für den fall, dass der Tag in der Zukunft liegt vor und eine andere für den Fall, dass der Tag ungültig ist

btw, die Methode im Fehlerfall wieder rekursiv aufzurufen kann man machen, aber eine Steuerung über eine Schleife empfinde ich als sinnvoller.
Die Aufgabenstellung deutet aber auf eine Rekursion hin
"Falls der eingegebene Geburtstag gemeinsam mit den Werten für Monat und Jahr kein gültiges Datum ergibt, soll eine geeignete Ausnahme ausgelöst werden. Implementieren Sie dafür eine neue Ausnahmeklasse namens IllegalDayException. Fangen Sie diese Ausnahme ab und behandeln Sie sie auf geeignete Weise. Geben Sie dabei dem Benutzer die Möglichkeit, seine fehlerhafte Eingabe zu korrigieren"

Denke mal das ist nicht weiter dramatisch. Am ende wird eh so lange abgebrochen bis das Datum stimmt.
 

mihe7

Top Contributor
Zusätzlich zu meinen Vorschreiben:

1. Du brauchst keine verschachtelten try-catches. Ein try mit mehreren catches reicht:

Java:
public static int requestBirthMonth(Calendar rightNow, int birthYear) {
        System.out.println("Geburtsmonat eingeben:");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int m = 0;
        try {
            m = Integer.parseInt(in.readLine());
            if (rightNow.get(Calendar.YEAR) == birthYear && rightNow.get(Calendar.MONTH) + 1 < m) {
                throw new IsFutureDateException();
            }
            return m;

        } catch (IsFutureDateException ex) {
            System.out.println("Monat liegt in der Zukunft, bitte neuen Monat eingeben");
            ex.printStackTrace();
            System.out.println("");
            return requestBirthMonth(rightNow, birthYear);
        } catch (NumberFormatException | IOException e) {
            System.out.println("bitte eine Zahl eingeben");
            e.printStackTrace();
            return requestBirthMonth(rightNow, birthYear);
        }
    }

2. Dann wäre die Überlegung, ob Du die Prüfung bzgl. des zukünftigen Datums nicht in eine andere Methode auslagern solltest. In dem Fall würde auch die IsFutureDateException mehr Sinn ergeben.

Java:
public static int requireYearNotAfter(Calendar date, int year) throws IsFutureDateException {
    if (year > date.get(Calendar.YEAR)) { // Reihenfolge der Logik angepasst
        throw new IsFutureDateException();
    }
    return year;
}

Damit würde der Code
Java:
                y = Integer.parseInt(in.readLine());
                if (rightNow.get(Calendar.YEAR) < y) {
                    throw new IsFutureDateException();
                }
                return y;
zu
Java:
                return requireYearNotAfter(rightNow, Integer.parseInt(in.readLine()));
 

nikva

Bekanntes Mitglied
2. Dann wäre die Überlegung, ob Du die Prüfung bzgl. des zukünftigen Datums nicht in eine andere Methode auslagern solltest. In dem Fall würde auch die IsFutureDateException mehr Sinn ergeben.
in der aufgabenstellung wird ausdrücklich nach 2 getrennten methoden verlangt
Aber die Lösung mit nur einem Try Block sind in der Tat deutlich eleganter aus :D
 

nikva

Bekanntes Mitglied
Es gibt auch ein UML Diagramm in dem nur die in der Aufgabenstellung beschriebenen Methoden auftauchen. Erhebt jetzt nicht den Anspruch komplett zu sein aber soll schon als Ziel dienen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
P Exception werfen Java Basics - Anfänger-Themen 15
M Exception werfen und bearbeiten Java Basics - Anfänger-Themen 1
3 Methoden Exception werfen oder nicht Java Basics - Anfänger-Themen 6
A Exception aus Thread werfen Java Basics - Anfänger-Themen 14
I Exception nicht werfen lassen Java Basics - Anfänger-Themen 3
D toString überschreiben + Exception werfen Java Basics - Anfänger-Themen 3
S Exception werfen Java Basics - Anfänger-Themen 2
G Comparator- methode compare exception werfen Java Basics - Anfänger-Themen 4
G Exception werfen Java Basics - Anfänger-Themen 4
W Exception werfen nur welche? Java Basics - Anfänger-Themen 17
F eigene Exception aus try-catch werfen Java Basics - Anfänger-Themen 10
D Exception werfen Java Basics - Anfänger-Themen 10
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
F abbruch Exception lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
1 Exception Java Basics - Anfänger-Themen 2
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
I JAX-RS Exception Handling Java Basics - Anfänger-Themen 4
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
J null exception Array Java Basics - Anfänger-Themen 5
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
C Exception-Frage Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
N Wie teste ich eine geworfene Exception? Java Basics - Anfänger-Themen 8
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
D Scanner- Exception NoSuchElementException Java Basics - Anfänger-Themen 2
A Exception handeling mit finally und objektreferenzen Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
S Exception Java Basics - Anfänger-Themen 2
J Exception-Aufgabe Java Basics - Anfänger-Themen 8
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
OSchriever Exception für Abbrechen-Schaltfläche JOptionpane Java Basics - Anfänger-Themen 9
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
J Exception unreachable Java Basics - Anfänger-Themen 12
O unchecked Exception Java Basics - Anfänger-Themen 4
B EJB und Arquillian - bekomme Nullpointer Exception beim Aufruf der EJB Klasse Java Basics - Anfänger-Themen 40
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
D Warum die Nullpointer Exception Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
I OOP Was ist die "Exception Hierarchie" ? Java Basics - Anfänger-Themen 3
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
G Exception und Ausgabe der Duplikate Java Basics - Anfänger-Themen 6
H Try Catch Throw Exception Java Basics - Anfänger-Themen 1
W Exception in Main abfangen oder in der Methode? Java Basics - Anfänger-Themen 10
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
Mosquera Exception Java Basics - Anfänger-Themen 5
M rekursive division/0 mit exception Java Basics - Anfänger-Themen 18
N Nullpointer exception Java Basics - Anfänger-Themen 4
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
S Array Grenzen-Exception Java Basics - Anfänger-Themen 11
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D Erste Schritte Java.lang.NullPointer.Exception Java Basics - Anfänger-Themen 8
G Arrays out of Bounds exception Java Basics - Anfänger-Themen 2
H Compiler-Fehler Out of Bunce Exception bei einem Char Java Basics - Anfänger-Themen 6
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
C Null Pointer Exception Java Basics - Anfänger-Themen 10
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
G Null Pointer Exception Java Basics - Anfänger-Themen 4
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
O Exception bei Parse-Vorgang Java Basics - Anfänger-Themen 17
T Exception Problem Java Basics - Anfänger-Themen 5
Z Getter/Setter NullPointer Exception Java Basics - Anfänger-Themen 6
W Nullpointer Exception bei .add(...) Java Basics - Anfänger-Themen 6
L Input/Output InputMismatch.Exception Java Basics - Anfänger-Themen 7
B Exception Liste von Liste Java Basics - Anfänger-Themen 3
D Throw Exception Java Basics - Anfänger-Themen 2
MiMa JavaDoc Exception @throws schlagen an Java Basics - Anfänger-Themen 4
J Exception in thread "main" Java Basics - Anfänger-Themen 1
B Exception richtig einbinden Java Basics - Anfänger-Themen 1
M Exception soll Werte mitgeliefert bekommen Java Basics - Anfänger-Themen 12
M Selbstdefinierte Exception Java Basics - Anfänger-Themen 5
B Exception Throwable Java Basics - Anfänger-Themen 11
M Erste Schritte Start Methode - Exception Java Basics - Anfänger-Themen 1
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
F nullpointer exception - arrayerstellung Java Basics - Anfänger-Themen 4
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
H Erste Schritte Exception: 0 Java Basics - Anfänger-Themen 2
A Exception vs. Testklasse (Programm testen) Java Basics - Anfänger-Themen 2
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben