1. Objektumok összehasonlítása a==
A kezdő programozók kedvenc hibája az objektumok (különösen a karakterláncok) összehasonlítása az ==
operátor segítségével. Például:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
Ez a kód soha nem jeleníti meg a "A karakterláncok egyenlők" szöveget, mivel az if
utasítás két különböző karakterlánc-objektumra hasonlítja össze a hivatkozásokat.
Íme a kód helyes verziója:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
System.out.println("The strings are equal");
}
2. String
Tárgy megváltoztatása
Az újonc programozók gyakran elfelejtik, hogy az osztály minden objektuma megváltoztathatatlan , és hogy az osztály minden metódusa String
új objektumot ad vissza – az aktuális objektum soha nem változik.
Példa:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
Ez a kód nagyon hasonlít a helyes kódra, de nem a várt módon fog működni. A toUpperCase()
metódus nem változtatja meg az objektumot, amelyen meghívásra került. A helyes kód így nézne ki:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
3. Elfelejtette inicializálni azokat az objektumokat, amelyek egy tömb elemei
Egy másik gyakori hiba, hogy elfelejtünk inicializálni egy tömbváltozót. Példa:
int[] array;
array[0] = 1;
array[0] = 2;
Ez a kód nem fog működni: a tömbváltozót kifejezetten a tömb elemeit tároló tárolóobjektumra való hivatkozással kell egyenlővé tenni.
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
4. Helyi változó használata példányváltozó helyett.
Az újoncok nem szeretnek hosszú és értelmes neveket kitalálni a változóknak. Gyakran használnak egybetűs neveket: a
, b
, i
, stb. Ez kegyetlen dolog, ha a kódnak több ilyen változója van:
Tegye a 99-es számot egy tömb 100 cellájába |
---|
|
A fenti kód nem fordítható le. A helyes verzió így néz ki:
Tegye a 99-es számot egy tömb 100 cellájába |
---|
|
5. Gyűjteményi elem eltávolítása
Nagyon gyakran vannak olyan helyzetek, amikor egy bizonyos elemet el kell távolítani a gyűjteményből. A kód nagyjából így néz ki:
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);
for (Integer value: list)
if (value < 0)
list.remove(value);
Ez a kód nem fog működni, mert nem használhat for-each ciklust a gyűjtemény elemeinek egyidejű bejárására és a gyűjtemény módosítására.
Több megoldás is létezik. Először is végigjárhat egy gyűjteményt, és megváltoztathat egy másikat:
1. megoldás |
---|
|
Másodszor, a Java 8 óta a gyűjteményeknek van egy removeIf()
metódusa, amelyhez átadhatunk egy szabályt (lambda függvény), amely jelzi, hogy mely elemeket kell eltávolítani.
Példa:
2. megoldás |
---|
|
6. Több osztály elhelyezése a módosítóval public
egyetlen fájlba
Egy fájlban csak egy nyilvános osztály lehet. Több osztály is deklarálható egy fájlban, de ezeknek vagy egy nyilvános osztály belső osztályainak kell lenniük, vagy nem kell tartalmazniuk a public
módosítót. Példa:
A Solution.java fájl tartalma | jegyzet |
---|---|
|
Ez nem megengedett: két nyilvános osztály egyetlen fájlban. |
|
De ezt megteheti. A főosztály nem nyilvános |
|
És ezt megteheted. A Main osztály egy beágyazott osztály |
7. Egy osztály közönséges (nem statikus) metódusainak hívása a statikus main()
metódusból
Néha a kezdő programozók megpróbálnak nem statikus változókat és metódusokat elérni a metódusból main()
vagy más statikus metódusokból. Az ilyen kód természetesen nem fog működni.
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
A fő módszer csak statikus módszerekre/változókra vonatkozhat. Nos, vagy először létre kell hoznia egy példányt az Solution
osztályból, és csak ezután kell meghívnia az objektum nem statikus metódusait. Példa:
1. megoldás | 2. megoldás |
---|---|
|
|
8. A konstruktor deklarálása metódusként
Egy másik gyakori hiba az osztálykonstruktor helytelen deklarálása. A konstruktor nevének meg kell egyeznie az osztály nevével, és a konstruktornak nincs eredménytípusa. A leggyakoribb hibák így néznek ki:
|
Itt nem szabad visszaküldési típust megadni |
|
Érvénytelen konstruktornév. A konstruktor nevének meg kell egyeznie az osztály nevével |
|
this hiányzik. A value változó önmagához lesz rendelve |
|
Ez mind helyes |
9. Az interfészek hibás öröklődése
A Java készítői igyekeztek nagyon közelíteni az angolhoz, ezért különböző kulcsszavakat választottak bizonyos kapcsolódó fogalmakhoz.
extends
Amikor egy osztály örököl egy osztályt, a kulcsszót kell használnia :
class Pet
{
}
class Cat extends Pet
{
}
implements
Amikor egy osztály örököl egy felületet, a kulcsszót kell használnia :
interface Meow
{
}
class Cat implements Meow
{
}
Ha egy interfész örököl egy interfészt, használja a extends
kulcsszót:
interface Meow
{
}
interface Voice extends Meow
{
}
10. Kihagyás break
nyilatkozatbanswitch
És ma az utolsó hiba számunkra, de a kezdők számára nem az utolsó, hogy nem teszünk nyilatkozatot break
egy switch
nyilatkozatba. Példa
Rossz | Jobb |
---|---|
|
|
GO TO FULL VERSION