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
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

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
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < count; i++)
      {
         a[i] = value;
      }
   }
}


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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );


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
public class Solution
{
}
public class Main
{
}
Ez nem megengedett: két nyilvános osztály egyetlen fájlban.
public class Solution
{
}
class Main
{
}
De ezt megteheti. A főosztály nem nyilvános
public class Solution
{
  public static class Main
  {
  }
}
É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
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}


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:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Itt nem szabad visszaküldési típust megadni
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Érvénytelen konstruktornév. A konstruktor nevének meg kell egyeznie az osztály nevével
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






this hiányzik. A valueváltozó önmagához lesz rendelve
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




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
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}