Ebben a metódusban mi a hiba?
private static void kerdes1() {
Scanner beolvas = new Scanner (System.in);
do {
ArrayList lista = new ArrayList();
System.out.println("Szeretne filebol beolvasni a teglalap adatait? (csak i vagy n legyen a valasz)");
String valasz = beolvas.nextLine();
lista.add(valasz);
int listanagysag = lista.size();
}
while (listanagysag != 1);
}
az elől tesztelő ciklus végénél irja ki a while résznél, hogy cannot find symbol, és nem tudtam rájönni, hogy hol a hiba benne:S
Azért, mert ha valamit utasításblokkba teszel, az ott létrehozott dolgok, pl. változók csak abban a blokkban léteznek. Röviden:
do {
int i = 5;
}
while (i == 5);
Itt az i változó a do-t követő utasításblokkban létrejön, de az utasításblokk végén felszabadul, megszűnik létezni. Így a while-nál lévő sorban ez nem létezik. A helyed megoldás:
int i;
do {
i = 5;
}
while (i == 5);
Néhány pro tippet is kapsz:
1) Ha a Scanner-t példányosítod, az megnyit olvasásra egy ún. adatáramot, stream-et. Ezt illő volna bezárni:
Scanner beolvas = new Scanner (System.in);
//...
beolvas.close();
Persze ma már ezt sem így illik csinálni. Van a try szerkezetnek egy olyan változata, ami a hozzá társított erőforrást automatikusan bezárja (try with resources):
try (Scanner beolvas = new Scanner (System.in)) {
}
//catch (Exception e) {} - ha nem keletkezik kivétel a try-ban, ez elhagyható.
2) A hagyományos ArrayList marha lassú. Ez az OOP alapelvek miatt van így. Valami olyasmin alapul a dolog, hogy "minden személygépkocsi, tehergépkocsi jármű, de nem minden jármű személygépkocsi". Vagyis, egyfajta öröklődési viszony áll fenn az osztályok közt. Ebbe bele lehetne menni, korábban már leírtam. Az ArrayList azt használja ki, hogy mindent Object-ként tárol, amit a gépnek sok műveletbe kerül megvalósítani. Használd helyette a generikus ArrayList<T>-t, vagy a LinkedList<T>-t, ahol a T helyére egy referenciatípust kell beírnod. Pl:
List<Integer> l = new LinkedList<Integer>();
3) A kódodban a ciklusnak mégis mi értelme van? Ha nem EOF-ot, vagy TERM jelet küld a felhasználó, mindig lesz beolvasott adat. Utóbbi két esetben pedig kivétellel összeszarja magát a programod.
4) A do...while pont hogy hátul tesztelő ciklus. Azért, mert előbb végrehajtod a kódot, és csak ezután ellenőrzöd, hogy le kell-e állni.
ArrayList lista = new ArrayList();
ezt a sort tedd a ciklus elé
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!