-
== kullanarak nesneleri karşılaştırma .
== operatörü , nesne referanslarını karşılaştırır.
Referanslar, bellekteki adreslere işaret eder. Farklı adreslerde depolanıyorlarsa, == kullanılarak yapılan karşılaştırma false değerini döndürür .
public class Vehicle { String model; int maxSpeed; int yearOfManufacture; public Car(String model, int maxSpeed, int yearOfManufacture) { this.model = model; this.maxSpeed = maxSpeed; this.yearOfManufacture = yearOfManufacture; } public static void main(String[] args) { Car ferrari = new Car("Ferrari 360 Spider", 280, 1996); Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996); System.out.println(ferrari == ferrariTwin); } }
Nesneleri karşılaştırmak için, Object sınıfının özel bir yöntemi vardır: equals() . Açıkçası, varsayılan uygulaması fena değil:
public boolean equals(Object obj) { return (this == obj); }
Object sınıfının kendisinde , equals() yöntemi, iki referansın karşılaştırması olarak uygulanır. Buna karşılık, nesneleri doğru bir şekilde karşılaştırmak için, bu yöntemi, belirli nesneleriniz için kendi programınızda ilgili olan kriterlere göre yeniden tanımlamanız gerekir. Eşitlik kriterleri size kalmış.
Unutmamanız gereken tek şey , equals() öğesini uygun şekilde geçersiz kılmak için gereksinimler listesidir . Onları internette kolayca bulabilirsiniz.
-
Statik yöntemlerde statik olmayan değişkenleri kullanma (ve tersi).
"Statik olmayan değişken x, statik bir bağlamdan referans alınamaz" mesajını daha önce gördüyseniz, kulübe hoş geldiniz :)
Statik yöntemlerin statik olmayan (örnek) değişkenlere erişimi yoktur.
Bu mantıklı: Sonuçta, sınıfından bir nesne yaratılmadan statik bir yöntem çağrılabilir ve tüm alanlar belirli nesnelere aittir. Hataya neden olan çelişki de buradadır.
Bu arada, diğer yöne gitmek gayet iyi çalışıyor: statik değişkenleri statik olmayan yöntemlerde kullanabilirsiniz:
public class Main { public int x = 10; public static int staticX = 100; public static void main(String[] args) { System.out.println(x); // Compilation error - you can't do this! } public void printX() { System.out.println(staticX); // But you can do this! } }
-
Argümanların yöntemlere nasıl iletildiğini yanlış anlama: referansa göre veya değere göre.
Nesneler ve ilkel öğeler, yöntemlere iki farklı şekilde aktarılır: birincisi, referans yoluyla; ikincisi, değere göre.
Yeni başlayanlar genellikle bu kavramı anlamakta zorlanırlar. Sonuç olarak, kodları beklenmedik şekilde davranır:
public class Main { public static void main(String[] args) { int x = 7; incrementNumber(x); System.out.println(x); Cat cat = new Cat(7); catLevelUp(cat); System.out.println(cat.getAge()); } public static void catLevelUp(Cat cat) { cat.setAge(cat.getAge()+1); } public static void incrementNumber(int x) { x++; } }
Tam olarak hangi sayının artacağını ve hangisinin artmayacağını bilmiyorsanız (eski sayı veya kedinin yaşı), konuyla ilgili dersimizi yeniden okuyun .
-
Kodlama kurallarını göz ardı etmek.
Bu, yalnızca belirli "teknik" ilkelere uygunluk için değil, aynı zamanda sıradan adlandırma kuralları için de geçerlidir.
Tüm bu kurallar (değişkenlerin nasıl adlandırılacağı, yöntem adlarının nasıl yazılacağı) bir nedenle icat edildi. Kodun okunabilirliğini gerçekten etkilerler
Sonuçta, kod her zaman yalnızca size ait olmayacaktır. Şirketinizde farklı bir projeye transfer olabilirsiniz. Kodunuzu devralan iş arkadaşlarınız, böyle bir şey gördüklerinde açıkça mutlu olmayacaklar:
public class Cat { private int S_O_M_E_T_H_I_N_G = 7; public String striiiiiiiiiiiiiing; protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14; boolean random = Math.random() > 0.5; }
Kodunuz dahice yüksek performansa sahip olabilir, ancak gerçekte nasıl çalıştığını okumak ve anlamak imkansızsa, o zaman ne yazık ki pek bir değeri yoktur.
Kodlama standartlarına bağlı kalırsanız, kodunuz ideal olmaktan uzak olsa bile, en azından daha deneyimli iş arkadaşlarınız size bunun teknik açıdan nasıl geliştirilebileceğini söyleyebilecektir :)
-
String sınıfını yanlış anlamak
public class Main { public static void main(String[] args) { String s1 = "I'm learning Java"; String s2 = new String("I'm learning Java"); System.out.println(s1 == s2); } }
Bu kodun neden false gösterdiğini bilmiyorsanız , bilginizi artırmanız gerektiği açıktır :)
Yeni başlayanlar genellikle Dize Havuzundan ve nasıl çalıştığından habersizdir .
Sonuç olarak, kodlarındaki dizeleri nasıl düzgün bir şekilde karşılaştıracaklarını tam olarak anlamıyorlar. Bu konuyu derslerimizden birinde ayrıntılı olarak inceledik .
-
İstisnaları yanlış işleme.
Bu konuda tökezleyenler sadece yeni başlayanlar değil. Deneyimli geliştiriciler de tökezliyor. Sebepler çoktur.
İlk olarak, evrensel bir tarif yoktur. Programların her türlü farklı hatası ve farklı hata işleme senaryoları vardır.
İkincisi, yığın izlemenin nasıl yapılandırıldığını herkes anlamaz . Anti-kalıpları ele alırken pek çok hata var ve bunların her biri kendi yolunda "yanlış". Bu, hata işlemeyi yanlış yapmanın hemen hemen her şeyden çok daha kolay olduğu anlamına gelir.
-
Operatörlerin (aritmetik, mantıksal ve diğerleri) nasıl çalıştığını tam olarak anlamamak.
İşte basit bir örnek. Bu kodun neyi görüntüleyeceğini hemen söyleyebilir misiniz?
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
Yanlış cevapladıysanız veya sadece tahmin ettiyseniz, bu alanda hala bilgi eksiklikleriniz var demektir :)
Eşitlik işleci ( == ) sonek artırma işlecinden ( ++ ) daha yüksek önceliğe sahip olduğundan, kod false gösterecektir . Bu nedenle, önce 7 == i karşılaştırması yürütülür ve ancak bundan sonra i++ işlemi gerçekleştirilir.
Bu arada bununla ilgili detaylı bir dersimiz de oldu. İşte link kaçırdıysanız.
-
Bir switch deyiminde break kelimesinin atlanması .
Bu makaleyi okuyan birçok kişi kesinlikle bu hatayı yaptı! :)
public class Main { public static void main(String[] args) { int i = 1; switch (i) { case 1: { System.out.println("The number is equal to 1"); } case 2: { System.out.println("The number is equal to 2"); } case 3: { System.out.println("The number is equal to 3"); } } } }
Sonuç olarak, yürütme mümkün olan her seçeneğin içinden geçer:
Çıktı:
Sayı 1'e eşittir Sayı 2'ye eşittir Sayı 3'e eşittir
Bir break deyimi, seçeneklerden birinin yürütülmesi tamamlandığında switch deyiminin yürütülmesini kesintiye uğratır. Unutma yoksa beklenmedik sonuçlar alabilirsin :)
Çaylak programcılar tarafından yapılan 8 yaygın hata
MERHABA! Bugün çaylak (ve diğer) Java geliştiricileri tarafından yapılan çok yaygın 8 hatayı inceleyeceğiz. Web'de bu tür pek çok liste bulacaksınız: birçoğu birbirine benziyor. Listemizi derlerken tek bir kriter bizi yönlendirdi: Eğitimimiz sırasında veya çalışırken hataları kendimiz yapıp yapmadığımız :) Önem sırasına göre sıralanmazlar — anlamanız ve hatırlamanız için eşit derecede önemlidirler.
GO TO FULL VERSION