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 ifutasí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. StringTá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 publicegyetlen 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 publicmó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 Solutionosztá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 valuevá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.
extendsAmikor egy osztály örököl egy osztályt, a kulcsszót kell használnia :
class Pet
{
}
class Cat extends Pet
{
}
implementsAmikor 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 extendskulcsszót:
interface Meow
{
}
interface Voice extends Meow
{
}
10. Kihagyás breaknyilatkozatbanswitch
És ma az utolsó hiba számunkra, de a kezdők számára nem az utolsó, hogy nem teszünk nyilatkozatot breakegy switchnyilatkozatba. Példa
| Rossz | Jobb |
|---|---|
|
|
GO TO FULL VERSION