"Merhaba Amigo! Hatalar hakkında konuşmaya devam edelim. Bu kez derleyicinin her zaman yardımcı olmayacağı hataları keşfedeceğiz. Dikkat et ve kendin hakkında bir şeyler öğren."

"Dinlemeye hazırım Diego. Umarım bu benim için çok utanç verici olmaz."

ile nesneleri karşılaştırma==

"En sevilen acemi programcı hataları listemiz, operatörü kullanarak nesneleri (özellikle dizeleri) karşılaştırmakla başlar =="

Örnek:

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

"Bunu oldukça sık yaptım. Artık bu kodun hiçbir zaman "Dizeler eşittir" ifadesini göstermeyeceğini açıkça görebiliyorum çünkü ifade ifiki farklı dize nesnesine yapılan başvuruları karşılaştırıyor."

"Evet. Bu yüzden doğru seçenek şu olurdu:

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

StringBir nesneyi değiştirmek

"Yeni başlayan programcılar genellikle sınıfın tüm nesnelerinin değişmez olduğunu ve sınıfın her yönteminin Stringyeni bir nesne döndürdüğünü - mevcut nesnenin asla değişmediğini unuturlar."

" Değişmezin ne anlama geldiğini öğreneli çok uzun zaman olmadı ama sanırım bunu yaptım.

"Bundan oldukça eminim. Örnek:

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

"Bu kod, doğru koda çok benzer, ancak beklendiği gibi çalışmaz. Yöntem, toUpperCase()çağrıldığı nesneyi değiştirmez. Doğru kod şöyle görünür:

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

"Kesinlikle. Bunu yaptım ama neyin yanlış olduğunu bile anlamadım. Açıklama için teşekkürler!"

Bir dizinin öğeleri olan nesneleri başlatmayı unutmak

"Başka bir yaygın hata, bir dizi değişkenini başlatmayı unutmak. Örnek:

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

"Bu kod çalışmaz: dizi değişkenini, dizinin öğelerini depolayacak kapsayıcı nesneye yapılan bir başvuruya eşit olarak açıkça ayarlamanız gerekir. Doğru sürüm:

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

Bir örnek değişken yerine yerel bir değişken kullanma.

"Yeni başlayanlar, değişkenler için uzun ve anlamlı isimler bulmaktan hoşlanmazlar."

a"Bu çok doğru. İşleri çabuk halletmek için bazen değişkenlere , b, ve gibi adlar veririm i."

"Bunu yapma. Kodun bunun gibi birkaç değişkeni olduğunda bu yapılacak zalimce bir şey:

99 sayısını bir dizinin 100 hücresine yerleştirin
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;
    }
  }
}

"Uygun adlarla kodda hata yapmak çok daha zordur. Doğru sürüm şöyle görünür:

99 sayısını bir dizinin 100 hücresine yerleştirin
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;
      }
   }
}

Bir koleksiyon öğesini kaldırma

"Koleksiyonlara zaten baktın mı?"

"Kelimenin tam anlamıyla tek gözle."

"Neden bahsettiğimi bilmiyorsanız, geleceğe bakmak için kendinize bir not alın. Çok sık olarak, belirli bir öğenin bir koleksiyondan çıkarılması gereken durumlar vardır. Kod kabaca şuna benzer: Bu:

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

for-each"Bu kod çalışmaz, çünkü bir döngüyü aynı anda bir koleksiyonun öğeleri arasında geçiş yapmak ve bu koleksiyonu değiştirmek için kullanamazsınız .

"Birkaç çözüm var. İlk olarak, bir koleksiyonda gezinebilir ve diğerini değiştirebilirsiniz:

Çözüm 1
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);

"İkincisi, Java 8'den bu yana koleksiyonların, removeIf()hangi öğelerin kaldırılacağını gösteren bir kuralı (lambda işlevi) iletebileceğiniz bir yöntemi vardır. Örnek:

Çözüm 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

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

Değiştirici ile birkaç sınıfı publictek bir dosyaya yerleştirme

"Bir dosyada yalnızca bir ortak sınıf olabilir. Bir dosyada daha fazla sınıf bildirilebilir, ancak bunlar ya bir genel sınıfın iç sınıfları olmalı ya da değiştiriciye sahip olmamalıdır. Örnek public:

Solution.java dosyasının içeriği Not
public class Solution
{
}
public class Main
{
}
Buna izin verilmez: tek bir dosyada iki ortak sınıf.
public class Solution
{
}
class Main
{
}
Ama bunu yapabilirsin. Ana sınıf herkese açık değil
public class Solution
{
  public static class Main
  {
  }
}
Ve bunu yapabilirsin. Ana sınıf iç içe geçmiş bir sınıftır.

Bir sınıfın olağan (statik olmayan) yöntemlerini statik yöntemden main()çağırma

"Bazen acemi programcılar, statik olmayan değişkenlere ve yöntemlere, yöntemden main()veya diğer statik yöntemlerden erişmeye çalışır. Bu tür kodlar elbette çalışmaz.

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

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

" mainYöntem yalnızca statik yöntemlere/değişkenlere atıfta bulunabilir. Ya da önce sınıfın bir örneğini oluşturmalı Solutionve ancak ondan sonra o nesnenin statik olmayan yöntemlerini çağırmalıdır. Örnek:

Çözüm 1 Çözüm 2
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();
  }
}

Bir yöntem gibi bir yapıcı bildirmek

"Başka bir yaygın hata, bir sınıf oluşturucuyu yanlış bir şekilde bildirmektir. Bir oluşturucunun adı, sınıfın adıyla aynı olmalıdır ve bir oluşturucunun sonuç türü yoktur. En yaygın hatalar şöyle görünür:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}
Burada bir dönüş tipi olmamalı
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}
Yapıcı adı geçersiz. Sınıf adıyla eşleşmelidir
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this kayıp. Değişken valuekendisine atanacak
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
Hepsi doğru.

Arayüzlerin yanlış kalıtımı

"Java'nın yaratıcıları, Java'yı İngilizce'ye çok yakın hale getirmeye çalıştılar, bu nedenle ilgili belirli kavramlar için farklı anahtar kelimeler seçtiler.

Bir sınıf bir sınıfı miras aldığında, anahtar kelimeyi kullanmanız gerekir extends:

class Pet
{
}

class Cat extends Pet
{
}

"Bir sınıf bir arayüzü miras aldığında veya daha doğrusu onu uyguladığında, anahtar kelimeyi kullanmanız gerekir implements:

interface Meow
{
}

class Cat implements Meow
{
}

"Bir arayüz bir arayüzü devraldığında, şu extendsanahtar kelimeyi kullanın:

interface Meow
{
}

interface Voice extends Meov
{
}

breakAçıklamada ihmal switch_

break"Ve bugünün son hatası, ancak yeni başlayanlar için son hata değil, bir ifadeye bir ifade eklememek switch. Örnek:

Yanlış Sağ
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;
}

"Biliyor musun, Diego... Burada sunduğun bir dizi hataya bakılırsa, kişisel günlüğümü okuyormuşsun gibi geliyor... Ya da görevleri çözerken beni izliyorsun."

"Ha! Hiç şüpheniz olmasın. Okudum, takip ettim ve takip etmeye devam ediyorum. O halde tetikte olun!"

"???"

"Endişelenme. Şaka yapıyorum. Dikkatli ol ve daha az aptalca hata yap."