Gyakorlati alapok
Indul a visszaszámlálás!
A konkrét probléma: gyermekeim rákattantak a számítógépre. Ez önmagában nem baj, elvégre modern gyerekek lesznek, akik nem ragadnak le a kapánál, ám ezt az időtöltést kezdetben nyilvánvalóan szűrni és korlátozni kell. Erre több lehetőségünk is van, első körben gondolhatunk a vekkerórára, amelyet adott időpontra húzunk fel: csörgéskor tehát vége a gépezésnek. A magam fajta programozó természetesen ilyen esetekben rögtön összedob egy funkcionális Java-alkalmazást. Az alábbi futtatható Java-kód természetesen még nem "elegáns" megoldás: nehezen futtatható és csak konzolos. A későbbiekben meg fogjuk írni ennek tetszetős, ablakos implementációját is.
A Java-nyelven belül a különböző időzítés-metódusok sok helyen előfordulnak, egyik fő implementációja a java.util.Timer, de található a swing-ben is. Az alábbi példakód mégsem ezekkel, hanem a futtatási szál (thread) késleltetésével trükközik. Ezt a Thread.sleep() metódus valósítja meg, amelynek paraméteréül a késleltetés hosszát kell megadnunk milliszekundumban. 1 másodperces késleltetés tehát így néz ki: Thread.sleep(1000).
Ezt a metódust kötelezően try-catch blokkba tennünk, erről, tehát a kivételkezelésről majd a későbbiekben szólunk, nélküle hibaüzenetet kapunk.
Szakértők részére!
Ők észre fogják venni és joggal tehetik szóvá, hogy a catch ág nincs lekezelve:
catch(InterruptedException ie){}
Tisztában vagyok vele, hogy "éles" projektben ilyet nem teszünk, ám ez csak egy olyan oktató példa, amelynek adott szintjén a kivételkezeléssel még nem is foglalkoztunk, következésképpen nincs értelme magyarázatok nélkül bármit is oda implementálni. Megjegyzem: komoly programozási szakkönyvek oktatási magyarázatok során ugyanígy tesznek. (Kérésre egy ilyen forráshivatkozást e-mailban elküldök.)
Az időegység-bekérést (perc-, vagy másodperc-visszaszámlálás? - String idoegysegBekeres) egy elöltesztelő ciklus ellenőrzi: a sec és min sztringeken felül semmi mást nem enged tovább.
Az időhosszt (int idoHossz) szintén egy elöltesztelő ciklus ellenőrzi, hogy értéke pozitív szám legyen.
Ezután be kell állítani a visszaszámlálás for ciklusának hosszát (int idoTartam), valamint a Thread.sleep() metódus milliszekundumos értékét, ahol:
-
1 másodperc = 1000;
-
1 perc = 60000;
int idoTartam = idoHossz;
idoHossz = 1000;
if(idoegysegBekeres.equals("min")){
idoHossz = 60000;
}
A visszaszámlálás végén pedig megjelenik egy VÉGE! felirat. Nézzük meg futtatható, konzolos Java-változatot:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println ("Másodperc (sec) vagy perc (min)?");
String idoegysegBekeres = in.nextLine();
while(!idoegysegBekeres.equals("sec") && !idoegysegBekeres.equals("min")){
System.out.println ("Kérem, hogy csak
'sec' vagy 'min' adjon meg!");
idoegysegBekeres = in.nextLine();
}
System.out.println ("Kérem adja meg az időmennyiséget!");
String szamBekeres = in.nextLine();
int idoHossz = Integer.parseInt(szamBekeres);
while (idoHossz <= 0){
System.out.println("Kérem, hogy csak
pozitív egész számot adjon meg!");
szamBekeres = in.nextLine();
idoHossz =
Integer.parseInt(szamBekeres);
}
int idoTartam = idoHossz;
idoHossz = 1000;
if(idoegysegBekeres.equals("min")){
idoHossz = 60000;
}
System.out.println();
for(int i = idoTartam; i > 0; i--){
try{
System.out.println(i);
Thread.sleep(idoHossz);
}catch(InterruptedException ie){}
}
System.out.println("VÉGE!");
}
}
Végeredmény (például):
Másodperc (sec) vagy perc (min)?
ora
Kérem, hogy csak 'sec' vagy 'min' adjon meg!
sec
Kérem adja meg az időmennyiséget!
5
5
4
3
2
1
VÉGE!