"Szia Amigo! Beszéljünk tovább a hibákról. Ezúttal olyan hibákat tárunk fel, amelyeken a fordító nem mindig segít. Figyelj oda, és tanulsz valamit magadról."

– Készen állok meghallgatni, Diego. Remélem, ez nem lesz túl kínos számomra.

Tárgyak összehasonlítása a==

"A legnépszerűbb kezdő programozói hibák listája az objektumok (különösen a karakterláncok) ==operátor használatával történő összehasonlításával kezdődik."

Példa:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("The strings are equal");
}

"Gyakran megcsináltam. Most már világosan látom, hogy ez a kód soha nem fogja megjeleníteni a "A karakterláncok egyenlők" szöveget, mert az ifutasítás két különböző karakterlánc-objektumra hasonlítja össze a hivatkozásokat.

"Igen. Ezért a megfelelő lehetőség a következő lenne:

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");
}

StringTárgy megváltoztatása

"A kezdő programozók gyakran elfelejtik, hogy az osztály minden objektuma megváltoztathatatlan , és az osztály minden metódusa Stringegy új objektumot ad vissza – az aktuális objektum soha nem változik."

„Nem olyan régen tanultam meg, mit jelent a megváltoztathatatlan , de azt hiszem, sikerült.

"Meglehetősen biztos vagyok benne. Példa:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

"Ez a kód nagyon hasonlít a helyes kódhoz, de nem működik a várt módon. A toUpperCase()metódus nem változtatja meg az objektumot, amelyen meghívták. A helyes kód így néz ki:

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase

"Pontosan. Megtettem, de nem is igazán értettem, mi a baj. Köszönöm a felvilágosítást!"

Elfelejtette inicializálni azokat az objektumokat, amelyek egy tömb elemei

"Egy másik gyakori hiba, hogy elfelejtenek 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. Helyes verzió:

int[] array = new int[10];
array[0] = 1;
array[0] = 2;

Helyi változó használata példányváltozó helyett.

"Az újoncok nem szeretnek hosszú és értelmes neveket kitalálni a változóknak."

"Ez annyira igaz. A dolgok gyors elintézése érdekében néha nevet adok a változóknak, például a, b, és i."

"Ne tedd ezt. 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;
    }
  }
}

"Sokkal nehezebb hibázni a kódban a tulajdonnevekkel. 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 < 10; i++)
      {
         a[i] = value;
      }
   }
}

Gyűjteményi elem eltávolítása

– Benéztél már a gyűjteményekbe?

– Szó szerint csak egy szemmel.

"Ha nem tudod, miről beszélek, akkor jegyezd meg magad, hogy a jövőben vess egy pillantást. 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. ez:

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-eachhurkot egy gyűjtemény elemeinek egyidejű bejárására és a gyűjtemény módosítására.

"Több megoldás 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 átadhat 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 );

Több osztály elhelyezése a publicmódosítóval egyetlen fájlba

"Egy fájlban csak egy nyilvános osztály lehet. Egy fájlban több osztály is deklarálható, de ezeknek vagy egy nyilvános osztály belső osztályainak kell lenniük, vagy nem kell tartalmazniuk a módosítót. Példa public:

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

Egy osztály szokásos (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 mainmetódus csak statikus metódusokra/változókra hivatkozhat. Nos, vagy először létre kell hoznia egy példányt az osztályból Solution, é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();
  }
}

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;
   }
}
A konstruktor neve érvénytelen. 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.

Az interfészek helytelen ö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
{
}

implements"Amikor egy osztály örököl egy interfészt, vagy pontosabban implementálja, akkor a kulcsszót kell használni :

interface Meow
{
}

class Cat implements Meow
{
}

"Ha egy felület örököl egy felületet, használja a extendskulcsszót:

interface Meow
{
}

interface Voice extends Meov
{
}

Kihagyás breakegy switchnyilatkozatban

"És a mai nap utolsó hibája, de a kezdők számára nem az utolsó, hogy nem szerepeltetnek egy breakállítást egy switchnyilatkozatban. 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;
}

– Tudod, Diego... Az itt bemutatott hibahalmazból ítélve, olyan érzésem van, mintha a személyes naplómat olvastad volna... Vagy figyeltél, ahogy feladatokat oldok meg.

"Ha! Ne kételkedjen efelől. Olvastam, követtem, és továbbra is ezt teszem. Szóval légy résen!"

"???"

"Ne aggódj. Csak viccelek. Légy éber, és kevesebb hülye hibát követj el."