CodeGym /Kurslar /Java SELF AZ /Yeni başlayan proqramçıların məşhur səhvləri

Yeni başlayan proqramçıların məşhur səhvləri

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Obyektləri == ilə müqayisə etmək

Yeni başlayan proqramçıların ən sevimli səhvi — obyektləri (xüsusilə string-ləri) == operatoru ilə müqayisə etməkdir. Məsələn:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("Sətirlər eynidir");
}

Bu kod heç vaxt "Sətirlər eynidir" yazısını çıxarmayacaq, çünki if-də iki fərqli string obyektinə aid referanslar müqayisə olunur.

Düzgün kod belə olmalıdır:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
   System.out.println("Sətirlər eynidir");
}


2. String obyektinin dəyişdirilməsi

Yeni başlayan proqramçılar tez-tez unudurlar ki, bütün class obyektləri dəyişməz (immutable) olur və String class-ın bütün metodları yeni obyekt qaytarır, mövcud obyekt isə heç vaxt dəyişmir.

Nümunə:

String s = "Salam";
s.toUpperCase(); // sətiri böyük hərflərlə yazmaq

Belə kod düzgünə çox oxşayır, amma işləməyəcək. toUpperCase() metodu çağırıldığı obyekti dəyişmir. Düzgün kod belə olacaq:

String s = "Salam";
String result = s.toUpperCase(); // sətiri böyük hərflərlə yazmaq


3. Massivin elementi olan obyektləri inicializasiya etməyi unutmaq

Daha bir tez-tez rast gəlinən səhv — massiv dəyişənini inicializasiya etməyi unutmaqdır. Nümunə:

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

Belə bir kod işləmir: array dəyişəninə massivin elementlərini saxlayacaq obyekt-konteynerin referensını açıq şəkildə mənimsətmək lazımdır.

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


4. Sinif sahəsini lokal dəyişənlə əvəz etmək.

Yeni başlayanlar uzun və mənalı dəyişən adları düşünməyi sevmirlər. Çox vaxt onlarda dəyişən adları a, b, i və s. kimi olur. Kodda bir neçə belə dəyişən olduqda bu onların başına bəla ola bilər:

Massivin 100 hüceyrəsinə 99 dəyərini daxil etmək
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;
    }
  }
}

Yuxarıdakı kod kompilyasiya olunmayacaq. Düzəldilmiş variant belə görünəcək:

Massivin 100 hüceyrəsinə 99 dəyərini daxil etmək
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. Kolleksiyadan elementin silinməsi

Tez-tez elə hallar olur ki, kolleksiyadan müəyyən elementi silmək lazımdır. Bu kod təxminən belə 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 işləməyəcək, çünki for-each dövrü ilə kolleksiyanın elementlərini keçərkən eyni kolleksiyanı dəyişmək olmaz.

Bunun bir neçə həlli var. Birinci olaraq, bir kolleksiyanı keçib, digərində dəyişiklik edə bilərsiniz:

Həll 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);

İkinci olaraq, Java 8-dən başlayaraq kolleksiyada removeIf() adlı bir metod əlavə olunub, hansı ki, qayda (lambda-funksiya) ötürərək hansı elementlərin silinəcəyini müəyyən etmək mümkündür.

Nümunə:

Həll 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

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


6. Bir faylda birdən çox public modifikatorlu sinif yerləşdirmək

Bir faylda yalnız bir ictimai (public) sinif ola bilər. Faylda başqa siniflər də elan edilə bilər, lakin onlar ya ictimai sinifin daxili sinifləri olmalıdır, ya da public modifikatoruna sahib olmamalıdır. Nümunə:

Solution.java faylının məzmunu Qeyd
public class Solution
{
}
public class Main
{
}
Belə olmaz: bir faylda iki ictimai sinif.
public class Solution
{
}
class Main
{
}
Belə olar. Main sinifi — ictimai deyil
public class Solution
{
  public static class Main
  {
  }
}
Bu da olar. Main sinifi — daxili sinifdir


7. main() statik metodundan sinfin adi metodlarını çağırmaq

Bəzən yeni başlayan proqramçılar main() və ya digər statik metodlardan qeyri-statik dəyişənlərə və metodlara müraciət edirlər. Belə bir kod, əlbəttə ki, işləməyəcək.

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

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

Main metodu yalnız statik metoda/dəyişənə müraciət edə bilər. Yaxud əvvəlcə Solution sinfinin obyektini yaratmalı, sonra isə bu obyektin qeyri-statik metodlarını çağırmalıdır. Nümunə:

Həll 1 Həll 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. Konstruktorun metod kimi elan edilməsi

Daha bir tez-tez rast gəlinən səhv – sinfin konstruktorunun səhv elan edilməsidir. Konstruktorun adı sinfin adı ilə eyni olmalıdır və konstruktorun dönüş tipi olmur. Ən çox rast gəlinən səhvlər belə görünür:

public class Person
{
   private String value;

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




Burada dönüş tipi lazım deyil
public class Person
{
   private String value;

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




Konstruktorun adı səhvdir. Konstruktorun adı sinfin adı ilə eyni olmalıdır
public class Person
{
   private String value;

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






Burada this yazılmayıb — value dəyişəni özünə təyin olunacaq
public class Person
{
   private String value;

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




Hər şey düzgündür


9. İntefeyslərin düzgün olmayaraq miras alınması

Java tərtibatçıları onu ingilis dilinə mümkün qədər yaxın etmək üçün çox çalışıblar, buna görə də bəzi əlaqəli anlayışlar üçün müxtəlif açar sözlər seçiblər.

Bir sinif başqa bir sinifdən miras alanda extends açar sözündən istifadə etmək lazımdır:

class Pet
{
}

class Cat extends Pet
{
}

Bir sinif interfeysdən miras alanda implements açar sözündən istifadə etmək lazımdır:

interface Meow
{
}

class Cat implements Meow
{
}

Bir interfeys başqa bir interfeysdən miras alanda extends açar sözündən istifadə etmək lazımdır:

interface Meow
{
}

interface Voice extends Meow
{
}


10. switch operatorunda break sözünün unutması

Və bizim sonuncu, amma yeni başlayanlar üçün son olmayan səhv switch çoxlu seçim operatorunda break operatorunun unudulmasıdır. Misal:

Səhv yazılmış Düzgün yazılmış
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Bazar ertəsi");
   case TUESDAY:
      System.out.println("Çərşənbə axşamı");
   case WEDNESDAY:
      System.out.println("Çərşənbə");
   case THURSDAY:
      System.out.println("Cümə axşamı");
   case FRIDAY:
      System.out.println("Cümə");
   case SATURDAY:
      System.out.println("Şənbə");
   case SUNDAY:
      System.out.println("Bazar");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Bazar ertəsi");
      break;
   case TUESDAY:
      System.out.println("Çərşənbə axşamı");
      break;
   case WEDNESDAY:
      System.out.println("Çərşənbə");
      break;
   case THURSDAY:
      System.out.println("Cümə axşamı");
      break;
   case FRIDAY:
      System.out.println("Cümə");
      break;
   case SATURDAY:
      System.out.println("Şənbə");
      break;
   case SUNDAY:
      System.out.println("Bazar");
      break;
}


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION