ParseException check / try - catch blokk
2021-02-18T12:53:27+01:00
2021-02-22T10:47:30+01:00
2022-08-12T01:00:32+02:00
CyberBot1111
Sziasztok!

Adott egy feladat: miszerint be kell kérnem a usertől egy termék lejárati idejét és ellenőriznem kell, hogy megfelelő formátumba adja-e meg. Ha nem akkor nem is mehetek tovább, ki kell lépnem a programból.
Kérdésem az lenne, hogy ezt hogyan tudom megoldani? ParseException-re nem tudok sehogysem feltételt írni. Valamint kérdésem még, hogy meglehetne a formátum ellenőrzést try-catch blokk nélkül is oldani valahogy? A feladatban egyértelműen ennek a használatát kérik, ez csak személyes kíváncsiság.

public static void main(String[] args) { Scanner sc = new Scanner(System.in); double daysBetween = 0; System.out.print("Kérem a termék lejárati idejét (yyyy.MM.dd. formátumban)! "); String freshDate = sc.nextLine(); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd."); Date dateBefore = sdf.parse(freshDate); } catch (ParseException ex) { System.out.println("Nem megfelelő formátum."); } System.out.print("Kérem a termék felbontási idejét (yyyy.MM.dd. HH:mm formátumban, vagy egy "-" jelet, ha nincs még felbontva)! "); String opened = sc.nextLine(); if (opened.equals("-")) { System.out.println("Még ehető!"); } else { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd."); SimpleDateFormat sdfSecond = new SimpleDateFormat("yyyy.MM.dd. HH:mm"); try { Date dateBefore = sdf.parse(freshDate); Date dateAfter = sdfSecond.parse(opened); long difference = dateAfter.getTime() - dateBefore.getTime(); daysBetween = (difference / (1000 * 60 * 60 * 24)); Date untilGoodDate = sdfSecond.parse(opened); Calendar cal = Calendar.getInstance(); cal.setTime(untilGoodDate); cal.add(Calendar.HOUR_OF_DAY, +72); if (daysBetween > 10) { System.out.println("Megromlott"); } else { System.out.println("Még ehető!"); } } catch (ParseException e) { System.out.println("Nem megfelelő formátum."); } } } }
Köszönöm előre is.
Mutasd a teljes hozzászólást!
Elég egy "nagy" külső blokk. Az első parse hiba után oda ugrik, nem fut tovább a kód.

public static void main(String[] args) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd."); SimpleDateFormat sdfSecond = new SimpleDateFormat("yyyy.MM.dd. HH:mm"); Scanner sc = new Scanner(System.in); System.out.print("Kérem a termék lejárati idejét (yyyy.MM.dd. formátumban)! "); String freshDate = sc.nextLine(); // Ha nem jó a formátum, akkor már a parse itt elszáll, elmegy a catch blokkig Date dateBefore = sdf.parse(freshDate); System.out.print("Kérem a termék felbontási idejét (yyyy.MM.dd. HH:mm formátumban, vagy egy "-" jelet, ha nincs még felbontva)! "); String opened = sc.nextLine(); if (opened.equals("-")) { System.out.println("Még ehető!"); } else { Date dateAfter = sdfSecond.parse(opened); long difference = dateAfter.getTime() - dateBefore.getTime(); double daysBetween = (difference / (1000 * 60 * 60 * 24)); Date untilGoodDate = sdfSecond.parse(opened); Calendar cal = Calendar.getInstance(); cal.setTime(untilGoodDate); cal.add(Calendar.HOUR_OF_DAY, +72); if (daysBetween > 10) { System.out.println("Megromlott"); } else { System.out.println("Még ehető!"); } } } catch (ParseException e) { System.out.println("Formátum hiba! " + e.getMessage()); }
    }
Mutasd a teljes hozzászólást!

  • Azt sikerült kitalálnom, hogy a Stringre írok feltételt:

    public static void main(String[] args) { Scanner sc = new Scanner(System.in); double daysBetween = 0; System.out.print("Kérem a termék lejárati idejét (yyyy.MM.dd. formátumban)! "); String freshDate = sc.nextLine(); if (freshDate.contains("-") || freshDate.charAt(4) != '.' || freshDate.charAt(7) != '.' || freshDate.charAt(freshDate.length() - 1) != '.') { System.out.println("Nem megfelelő formátum"); } else { System.out.print("Kérem a termék felbontási idejét (yyyy.MM.dd. HH:mm formátumban, vagy egy "-" jelet, ha nincs még felbontva)! "); String opened = sc.nextLine(); if (opened.equals("-")) { System.out.println("Még ehető!"); } else { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd."); SimpleDateFormat sdfSecond = new SimpleDateFormat("yyyy.MM.dd. HH:mm"); try { Date dateBefore = sdf.parse(freshDate); Date dateAfter = sdfSecond.parse(opened); long difference = dateAfter.getTime() - dateBefore.getTime(); daysBetween = (difference / (1000 * 60 * 60 * 24)); Date untilGoodDate = sdfSecond.parse(opened); Calendar cal = Calendar.getInstance(); cal.setTime(untilGoodDate); cal.add(Calendar.HOUR_OF_DAY, +72); if (daysBetween > 10) { System.out.println("Megromlott"); } else { System.out.println("Még ehető!"); } } catch (ParseException e) { System.out.println("Nem megfelelő formátum."); } } } } }
    Mutasd a teljes hozzászólást!
  • Szia!

    A legegyszerűbb, ha a ParseException elkapása és a hibaüzenet kiíratása után kilépsz a programból:

    } catch (ParseException ex) { System.out.println("Nem megfelelő formátum."); return; }
    Nem érdemes saját formátum ellenőrzőt írnod, csak a hibalehetőségek számát növeled vele - a te ellenőrzéseden átcsúszik, de mégis exception-t dob a parser, stb.
    Mutasd a teljes hozzászólást!
  • Elég egy "nagy" külső blokk. Az első parse hiba után oda ugrik, nem fut tovább a kód.

    public static void main(String[] args) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd."); SimpleDateFormat sdfSecond = new SimpleDateFormat("yyyy.MM.dd. HH:mm"); Scanner sc = new Scanner(System.in); System.out.print("Kérem a termék lejárati idejét (yyyy.MM.dd. formátumban)! "); String freshDate = sc.nextLine(); // Ha nem jó a formátum, akkor már a parse itt elszáll, elmegy a catch blokkig Date dateBefore = sdf.parse(freshDate); System.out.print("Kérem a termék felbontási idejét (yyyy.MM.dd. HH:mm formátumban, vagy egy "-" jelet, ha nincs még felbontva)! "); String opened = sc.nextLine(); if (opened.equals("-")) { System.out.println("Még ehető!"); } else { Date dateAfter = sdfSecond.parse(opened); long difference = dateAfter.getTime() - dateBefore.getTime(); double daysBetween = (difference / (1000 * 60 * 60 * 24)); Date untilGoodDate = sdfSecond.parse(opened); Calendar cal = Calendar.getInstance(); cal.setTime(untilGoodDate); cal.add(Calendar.HOUR_OF_DAY, +72); if (daysBetween > 10) { System.out.println("Megromlott"); } else { System.out.println("Még ehető!"); } } } catch (ParseException e) { System.out.println("Formátum hiba! " + e.getMessage()); }
        }
    Mutasd a teljes hozzászólást!
  • Ha pedig ellenőrizni akarod a dátum formátumát, akkor azt reguláris kifejezéssel is megteheted.
    Bár teljes dátumellenőrző reguláris kifejezést nehéz írni, mert pl. a szökőév kezelés, a 30 napos hónapok bekavarhatnak.

    String DATE_PATTERN = "^([12]\d{3}\.(0[1-9]|1[0-2])\.(0[1-9]|[12]\d|3[01])\.)$"; String DATE_TIME_PATTERN = "^([12]\d{3}\.(0[1-9]|1[0-2])\.(0[1-9]|[12]\d|3[01])\.) (0[1-9]|[1]\d|2[0123]):([0-5][0-9])$"; boolean freshDateOk = freshDate.matches(DATE_PATTERN); boolean openedOk = opened.matches(DATE_PATTERN);
    Ezek után a parse nem fog exception-t dobni (ha a pattern és a DateFormat szinkronban van), de az exception elkapását nem úszod meg.
    Mutasd a teljes hozzászólást!
  • Wow!  Nagyon szépen köszönöm neked, így már tiszta, hogy miképp alkalmazzam!!
    Mutasd a teljes hozzászólást!
  • Nagyon szépen köszönöm a válaszod!
    Mutasd a teljes hozzászólást!
  • Annyi kérdésem lenne még ehhez, hogy abban az esetben, ha egy nagy kódblokkot használok, akkor a '-' -ra is hibát dob. Ez pedig annak a jelzése lenne, hogy nem lett még kibontva a termék. Van erre esetleg ötleted?
    Mutasd a teljes hozzászólást!
  • Szia!

    Ha kötőjelet adsz meg a második feltett kérdésre, akkor azt fogja kiírni, hogy még ehető. Szóval nem értem a kérésedet.

    Egy apró módosítás talán kell a kódhoz, hogy lefusson.

    System.out.print("Kérem a termék felbontási idejét (yyyy.MM.dd. HH:mm formátumban, vagy egy "-" jelet, ha nincs még felbontva)! ");
    Ide a kötőjel köré nem elég a ", ha azt akarsz írni, mert az string határoló. Ilyenkor " kell.

    Szerkesztés: a motor is lenyeli, amit írtam, szóval egy per jel (AltGR - Q) és utána egy idézőjel kell.

    \"

    Üdv.
    Mutasd a teljes hozzászólást!
abcd