CodeGym /Java Kursu /All lectures for TR purposes /Acemi programcılar tarafından yapılan popüler hatalar

Acemi programcılar tarafından yapılan popüler hatalar

All lectures for TR purposes
Seviye , Ders
Mevcut

1. Nesneleri ile karşılaştırma==

Acemi programcıların en sevdiği hata, operatörü kullanarak nesneleri (özellikle dizileri) karşılaştırmaktır ==. Örneğin:

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

Bu kod hiçbir zaman "Dizeler eşittir" ifadesini görüntülemez, çünkü ififade referansları iki farklı dize nesnesiyle karşılaştırır.

İşte kodun doğru versiyonu:

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. Bir Stringnesneyi değiştirmek

Acemi 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ü unutur - geçerli nesne asla değişmez.

Ö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


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

Diğer 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.

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


4. Örnek değişken yerine yerel değişken kullanma.

Acemiler, değişkenler için uzun ve anlamlı isimler bulmayı sevmezler. Sıklıkla tek harfli isimler kullanırlar: a, b, , vs.i

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

Yukarıdaki kod derlenmeyecek. 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 < count; i++)
      {
         a[i] = value;
      }
   }
}


5. Bir koleksiyon öğesinin çıkarılması

Çoğu zaman, belirli bir öğenin bir koleksiyondan çıkarılması gereken durumlar vardır. Kod kabaca şöyle görünür:

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

Bu kod çalışmaz çünkü for-each döngüsünü 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 );


6. 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 public. Örnek:

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.


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

Bazen yeni başlayan programcılar, yöntemden veya diğer statik yöntemlerden statik olmayan değişkenlere ve yöntemlere erişmeye çalışır main(). Böyle bir kod 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();
   }
}

Ana yö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 o zaman 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();
  }
}


8. Bir metot gibi bir yapıcı bildirmek

Diğer bir yaygın hata, yanlış bir şekilde bir sınıf kurucusu bildirmektir. Bir yapıcının adı, sınıfın adıyla aynı olmalıdır ve bir yapıcının 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;
   }
}




Geçersiz kurucu adı. Yapıcının adı, 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


9. 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 belirli ilgili 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, anahtar kelimeyi kullanmanız gerekir implements:

interface Meow
{
}

class Cat implements Meow
{
}

Bir arabirim bir arabirimi miras aldığında, şu extendsanahtar sözcüğü kullanın:

interface Meow
{
}

interface Voice extends Meow
{
}


10. breakAçıklamada switchatlamak

breakVe bugün bizim için son hata, 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;
}

Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION