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 |
|---|
|
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 |
|---|
|
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 |
|---|
|
İ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 |
|---|
|
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 |
|---|---|
|
Belə olmaz: bir faylda iki ictimai sinif. |
|
Belə olar. Main sinifi — ictimai deyil |
|
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 |
|---|---|
|
|
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:
|
Burada dönüş tipi lazım deyil |
|
Konstruktorun adı səhvdir. Konstruktorun adı sinfin adı ilə eyni olmalıdır |
|
Burada this yazılmayıb — value dəyişəni özünə təyin olunacaq |
|
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ış |
|---|---|
|
|
GO TO FULL VERSION