Try catch blokkra feltétel
2021-02-19T22:17:51+01:00
2021-02-20T09:58:05+01:00
2022-08-12T01:00:32+02:00
CyberBot1111
Sziasztok!


Azt a feladatot kaptam, hogy írjak egy munkanapszámláló programot. Egyik feltétele a feladatnak a try catch blokk használata a kódban, mégpedig a formátum ellenőrzésére. A probléma ezzel csak annyi, hogy ha a user nem a dátumot, hanem egy "-" jelet ír be, akkor azzal a parse el is száll, viszont a feladat szerint ez annak a jele kéne legyen, hogy nincs több dátum, amit be kellene kérnünk. Kérdésem az lenne, hogy lehet-e kivételt írni a parsnek, hogy ha kötőjelet érzékel ne szálljon el?

Példa a feladatra: 

"Melyik az évközbeni szünet első napja? (yyyy.MM.dd. formátumban, - jel, ha nincs több.)"

Kódom:

public static void main(String[] args) { //checking the format of the input try { double daysBetweenSecondCounter = 0.0; int counter = 0; int counterSecond = 0; Scanner sc = new Scanner(System.in); int workDays = 0; System.out.print("Melyik a nyári vakáció első napja? (yyyy.MM.dd. formátumban) "); String input = sc.nextLine(); //Date for now Date now = new Date(); Calendar nowCal = Calendar.getInstance(); nowCal.setTime(now); Calendar holidayCalendar = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); Date inputDate = sdf.parse(input); holidayCalendar.setTime(inputDate); long difference = inputDate.getTime() - now.getTime(); double daysBetween = difference / (1000 * 60 * 60 * 24); //get workingdays until holiday do { nowCal.add(Calendar.DAY_OF_MONTH, 1); if (nowCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && nowCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { workDays++; } } while (nowCal.getTimeInMillis() < holidayCalendar.getTimeInMillis()); System.out.println("Évközi szünetek felvitele:"); do { System.out.print("Melyik az évközbeni szünet első napja? (yyyy.MM.dd. formátumban, - jel, ha nincs több.) "); String firstFree = sc.nextLine(); Date firstFreeDate = sdf.parse(firstFree); if (firstFree.equals("-")) { counter++; } else { System.out.print("Melyik az évközbeni szünet utolsó napja? (yyyy.MM.dd. formátumban) "); String lastFree = sc.nextLine(); Date lastFreeDate = sdf.parse(lastFree); long differenceSecond = lastFreeDate.getTime() - firstFreeDate.getTime(); double daysBetweenSecond = differenceSecond / (1000 * 60 * 60 * 24); //counting the freedays; daysBetweenSecondCounter += daysBetweenSecond; } } while (counter == 0); System.out.println("Munkanap áthelyezések:"); do { //ezt le kell vonni a munkanapokból System.out.print("Melyik munkanap lesz szünet? (yyyy.MM.dd. formátumban, - jel, ha nincs több.) "); String workingDaysIsHoliday = sc.nextLine(); Date workingDaysDate = sdf.parse(workingDaysIsHoliday); if (workingDaysIsHoliday.equals("-")) { counterSecond++; } else { //ezt hozzá kell adni a munkanapokhoz System.out.println("Melyik szünnapon kell cserébe dolgozni? (yyyy.MM.dd. formátumban) "); String holidayIsWorkingDay = sc.nextLine(); Date holidayIsWorkingDayDate = sdf.parse(holidayIsWorkingDay); } } while (counterSecond == 0); System.out.println("Hátralévő iskolai napok száma a mai nappal együtt: "); } catch (ParseException ex) { System.out.println("Nem megfelelő formátum."); } } }


Nagyon szépen köszönöm előre is.
Mutasd a teljes hozzászólást!
Nekem az jött le a leírásból, hogy itt a tanárod arra gondolt a feladatban, hogy a try-catch blokk legyen maga a figyelő blokk, amely segítségével eldöntöd, hogy még dátumot, vagy "-" jelet kap a program.
Tehát ciklusodat a try blokkba teszed, megnézed benne, hogy mit kaptál. Dátuom, és ha az munkanap, akkor workDays++, ha "-" akkor dobsz egy explicit kivételt, és a kód azonnal a catch ágban folytatja a futást, amelyben megcsinálod a workDays kezelését, és programozottan - szépen - le tudod zárni a programot, anélkül, hogy a futás elszállna a "-" karaktertől. A lényeg, hogy a mostani megoldásban te az egész kódot egy try-catch blokkba tetted, de elég lenne, csak a vizsgálatot, a többit a catch blokkba, majd a finally-ben meg a lezáró szöveget.
A szép kód pedig az lenne, ha ezek a részek is egy önálló metódusba kerülnének, és azokat hívnád a try-catch-finally blokkból.
Ne felejtsd el, egy try ágnak több catch ága is lehet, írhatsz egyéni kivételt is, a finally pedig - néhány ritka kivételtől eltekintve - mindig lefut a try vagy a catch blokk után.

Tehát én kissebbre venném a try-catch hatókörét, és többet hasznélnék, ott, ahol arra szükség van. Valami ilyesmire gondoltam:

//változók inicializálása, kezdőérték adás... try { //adat bekérés.... Date inputDate = sdf.parse(input); holidayCalendar.setTime(inputDate); //külön metódusba a dátum kezelést...-> Melyik az évközbeni szünet első napja? / Melyik az évközbeni szünet utolsó napja? ... } catch (Exception ex) { if(input.equals("-")) { //nincs több dátum, amit be kellene kérnünk... } else { //Nem megfelelő formátum... } }
Mutasd a teljes hozzászólást!

  • A dátum bekérése után közvetlenül vizsgáld meg, hogy az csupán egyetlen - karakterből áll-e, s ha igen akkor kilépés a ciklusból, ha nem, akkor jöhet a parsolás.
    Mutasd a teljes hozzászólást!
  • Nekem az jött le a leírásból, hogy itt a tanárod arra gondolt a feladatban, hogy a try-catch blokk legyen maga a figyelő blokk, amely segítségével eldöntöd, hogy még dátumot, vagy "-" jelet kap a program.
    Tehát ciklusodat a try blokkba teszed, megnézed benne, hogy mit kaptál. Dátuom, és ha az munkanap, akkor workDays++, ha "-" akkor dobsz egy explicit kivételt, és a kód azonnal a catch ágban folytatja a futást, amelyben megcsinálod a workDays kezelését, és programozottan - szépen - le tudod zárni a programot, anélkül, hogy a futás elszállna a "-" karaktertől. A lényeg, hogy a mostani megoldásban te az egész kódot egy try-catch blokkba tetted, de elég lenne, csak a vizsgálatot, a többit a catch blokkba, majd a finally-ben meg a lezáró szöveget.
    A szép kód pedig az lenne, ha ezek a részek is egy önálló metódusba kerülnének, és azokat hívnád a try-catch-finally blokkból.
    Ne felejtsd el, egy try ágnak több catch ága is lehet, írhatsz egyéni kivételt is, a finally pedig - néhány ritka kivételtől eltekintve - mindig lefut a try vagy a catch blokk után.

    Tehát én kissebbre venném a try-catch hatókörét, és többet hasznélnék, ott, ahol arra szükség van. Valami ilyesmire gondoltam:

    //változók inicializálása, kezdőérték adás... try { //adat bekérés.... Date inputDate = sdf.parse(input); holidayCalendar.setTime(inputDate); //külön metódusba a dátum kezelést...-> Melyik az évközbeni szünet első napja? / Melyik az évközbeni szünet utolsó napja? ... } catch (Exception ex) { if(input.equals("-")) { //nincs több dátum, amit be kellene kérnünk... } else { //Nem megfelelő formátum... } }
    Mutasd a teljes hozzászólást!
abcd