Egyszerű rendezős utasítássor hibaüzenettel tér vissza. Mi lehet a probléma?
Egy hete kezdtem ismerkedni a Java-val.
Próbáltam írni benne egy kódot, ami megrendezi a számokat. Sikeresen ki is írja rendezve, viszont mellé kaptam még
egy hibaüzenetet is :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at szamlalo.main(szamlalo.java:14).
A kód:
class szamlalo {
public static void main(String[] args) {
int[] szam ={21, 10, 3, 100, 21, 32};
for (int i = 0; i < szam.length-1; i++) {
for (int j = 0; j < szam.length-1; j++) {
if (szam[j] > szam[j+1]) {
int s = szam[j];
szam[j] = szam[j+1];
szam[j+1] = s;
}
}
}
for (int i = 0; i <=szam.length; i++) {
System.out.print(szam[i] + " ");
}
}
}
Vajon mi lehet a probléma?
For cikluson belül folyamatosan integert foglalni nem túl okos ötlet.
Másrészt, ha foglalsz egy int[] szam ={21, 10, 3, 100, 21, 32}; tömböt, akkor szam.length 6 értéket fog adni, vagyis a tömböt 0-5-ig tudod indexelni, és az utolsó elemnél a for ciklusod szam.length-1 ugyan 5 értékű lesz, de az egyel nagyobb elem szam[j] = szam[j+1]; vagyis szam[5] = szam[6];-nál fog kiakadni, mert nincs 6-os számú elem a tömbben.
Teljesen jogos, hogy exceptiont dob. Megoldás a buborékrendezésre:
for (int i = 0; i < szam.length-1; i++) {
for (int j = 0; j < szam.length-2; j++) {
> For cikluson belül folyamatosan integert foglalni nem túl okos ötlet.
A fordító okos, nem fog minden iterációban integert foglalni. Nem az az optimalizáció, ha kirakod a ciklusból ezeket a sorokat. Ezt a balgaságot nem tudom honnan szedted, de felejtsd el! Még a hőskorszakban is tudták ezt a fordítóprogramok.
A két kódrészlet ugyan azt a gépi kódot eredményezi:
for (;;)
{
int i = 4;
dosomething(i);
}
int i;
for (;;)
{
i = 4;
dosomething(i);
}
Próbáld ki ha nem hiszed.
És az első válaszoló második "problémája" is hülyeség. A ciklus addig ment, míg kisebb, mint length-1. Azaz 4-ig. És 4-es és 5-ös elem van. Ezekkel semmi gond nincs.
Másrészt a módosításával a {21, 10, 3, 100, 21, 12} tömböt így "rendezi": {3, 10, 21, 21, 100, 12}
Amire a válaszoló gondolt sztem az, hogy szam.length-1-i-ig menjen a ciklus, ez így még gyorsabb is lesz.
A kérdező igazi gondja a kiírásnál van. i<=szam.length helyett i<szam.length kell
> Azokat verném pofán, akik ilyen hülyeségek miatt nagyobb scope-ba teszik amit nem kéne.
Egyetértek kedves iostream. Az hogy egy scope-al fentebb teszik a deklarációt szerintem C vagy pascal beidegződés lehetett.
A nyelvek fejlődnek, a programozók nem mindig...
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!