Gyakorlati alapok II.
Konkrét példa: döntsük már el, hogy szám-e vagy szöveg!
A kivétel kezelése alapvetően "passzív" tevékenység, azaz tisztában vagyunk a programozás-technikai vészhelyzetekkel és megpróbálunk ezekre optimálisan reagálni.
Sok programozó azonban még ennél is tovább lép és egyenesen -valamilyen magasabb szintű cél érdekében-, "aktív" módon váltja ki a kivételt.
Ennek demonstrálására nézzük meg az alábbi feladatot!
Adott egy egyszerű szövegbeviteles probléma, amely során nem tudjuk, hogy a felhasználó mit gépel be, szöveget vagy számot. A megoldás természetesen többféle módon is implementálható, itt és most azt fogjuk kihasználni, hogy a JVM nem tud szöveget (string típusú karakterfűzért) számmá konvertálni (itt az Integer.parseInt() függvénnyel), hanem ekkor NumberFormatException kivételt dob. A kivételt azonban elkapjuk a catch ágban és ekkor bizonyosak lehetünk abban, hogy a bevitt adat nem szám.
Az alábbi futtatható Java-kód a fenti feltételeket vizsgálja string és int típusú numerikus egész bemeneti adat esetében.
A program nincs felkészítve numerikus lebegőpontos adat vizsgálatára, ebből következően minden ilyen jellegű adatbevitelt, például...
-
3,14
-
3.14
...nem konvertálhatónak, azaz NEM (int) számnak fog értékelni.
(Zárójelben jegyzem meg, hogy a JVM egyébként is kényes a rossz tizedesjegy-karakterekre és vessző /,/ használata esetén szintén azonnal dob egy NumberFormatException kivételt, természetesen ekkor Double.parseDouble() függvényt használunk.)
Továbbá a program nem végez alsó és felső határ-ellenőrzést sem (itt elsősorban az int adattípus tárkorlátaira gondolok), így könnyen dobhat ilyen jellegű, de már lekezeletlen kivételt. Teszteléskor mindezeket vegyük figyelembe!
Ezen problémák megoldása a kód alapján legyen a Tisztelt Olvasó házi feladata.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String adat = "";
int szam = 0;
boolean nemSzam = false;
String[] menu = new String[] {"1 - Bevitel", "0 - Kilépés"};
while(true) {
System.out.println("\nKérem válasszon
az alábbi lehetőségekből: ");
for(int i = 0; i < menu.length; i++)
{
System.out.println(menu[i]);
}
String valasztas = in.nextLine();
if("1".equals(valasztas)) {
adat = "";
szam = 0;
nemSzam = false;
System.out.println("Kérem, hogy adja
meg az adatot!");
adat = in.nextLine();
try{
szam =
Integer.parseInt(adat);
}
catch(NumberFormatException nfe){
nemSzam =
true;
}
if(nemSzam){
System.out.println("Az adat: " + adat + " NEM (int) szám!");
}
else
System.out.println("Az adat: " + szam + " szám!");
}
if("0".equals(valasztas)) {
System.out.println("\nViszlát!");
System.exit(0);
}
}
}
}
Végeredmény:
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
1
Az adat: 1 szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
23
Az adat: 23 szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
43330
Az adat: 43330 szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
s
Az adat: s NEM (int) szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
Az adat: NEM (int) szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
3.14
Az adat: 3.14 NEM (int) szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
1
Kérem, hogy adja meg az adatot!
cirbolya
Az adat: cirbolya NEM (int) szám!
Kérem válasszon az alábbi lehetőségekből:
1 - Bevitel
0 - Kilépés
0
Viszlát!