September 10, 2026
Yazılımda en çok yapılan kodlama hataları
Yazılım geliştirme sürecinde hatalar (bug’lar) kaçınılmazdır. Ancak yapılan hataların büyük bir kısmı, syntax (sözdizimi) hatalarından…
By Yoldasyilmaz
3 min read
Yazılım geliştirme sürecinde hatalar (bug'lar) kaçınılmazdır. Ancak yapılan hataların büyük bir kısmı, syntax (sözdizimi) hatalarından ziyade mantık hataları ve kötü alışkanlıklardan kaynaklanır.
İşte modern yazılım mühendisliğinde en çok yapılan kodlama hataları ve bu hatalardan kaçınma yöntemleri:
1. Kötü İsimlendirme ve Okunaksız Kod
Kod yazarken en çok göz ardı edilen ama teknik borcu (technical debt) en çok artıran hata, değişken ve fonksiyonlara anlamlı isimler vermemektir. x, data, temp veya islem Yap() gibi isimler, kodun neden yazıldığını açıklamaz.
- Çözüm: Kodunuzun bir hikaye anlatıyormuş gibi net olması gerekir. Değişken ve fonksiyon isimleri, üstlendiği görevi açıkça belirtmelidir (Örn: x yerine userRemainingAttempts).
2. Hata Yönetiminin İhmal Edilmesi (Exception Handling)
Çoğu geliştirici kodun sadece en ideal senaryoda nasıl çalışacağına odaklanır (Happy Path). API'nin çökeceği, internetin kesileceği veya kullanıcının geçersiz bir veri gireceği durumlar (try-catch blokları eksik bırakılarak) genellikle göz ardı edilir.
- Çözüm: Potansiyel hata noktalarını önceden belirleyin. Boş catch blokları kullanmaktan kaçının; hataları mutlaka loglayın veya kullanıcıya anlamlı geri bildirimler verin.
3. Null Reference (Boş Referans) Hataları
Yazılım dünyasının milyar dolarlık hatası olarak bilinen NullPointerException, bir nesnenin bellekte var olduğunu varsayıp onun üzerinde işlem yapmaya çalışmaktan kaynaklanır.
- Çözüm: Modern dillerin sunduğu Optional, null-conditional (?.) veya null-coalescing (??) operatörlerini kullanın. Verileri kullanmadan önce mutlaka kontrol edin.
4. Tekerleği Yeniden Keşfetmek (Don't Reinvent the Wheel)
Zaten endüstri standardı haline gelmiş, binlerce geliştirici tarafından test edilmiş kütüphaneler varken (örneğin tarih-saat işlemleri veya şifreleme algoritmaları), bu çözümleri sıfırdan yazmaya çalışmak hem zaman kaybına hem de güvenlik açıklarına yol açar.
- Çözüm: İhtiyacınız olan fonksiyon güven kritik bir süreç içeriyorsa, topluluk tarafından kabul görmüş, güvenilir ve açık kaynaklı kütüphaneleri tercih edin.
5. Yetersiz Test veya Test Yazmamak
"Kod yerel bilgisayarımda çalışıyor, o halde üretime (production) hazırdır" düşüncesi en büyük yanılgılardan biridir. Bir özelliği düzeltirken sistemin başka bir yerini bozmak (regression) çok sık yaşanır.
- Çözüm: Unit (Birim) ve Integration (Entegrasyon) testlerini sürecinize dahil edin. Test otomasyonları, gelecekte yapacağınız değişikliklerin güvenle yapılmasını sağlar.
En Sık Yapılan Hataların Karşılaştırma Tablosu
Hata Türü
Neden Olduğu Sorun
En Pratik Çözüm
Kötü İsimlendirme
Kodun anlaşılamaması ve bakım zorluğu
Anlamlı ve açıklayıcı isimlendirme
Eksik Hata Yönetimi
Uygulamanın aniden çökmesi (Crash)
Düzenli try-catch ve loglama
Null Kontrolsüzlüğü
Çökme ve beklenmeyen çalışma mantığı
Null-safe operatörler kullanmak
Test Eksikliği
Yeni güncellemelerde eski kodun bozulması
CI/CD süreçlerine testleri dahil etmek
Bu hataları aşağıdaki şekilde Java ile örneklendirebiliriz:
Java dünyasında en sık yapılan kodlama hataları, dilin nesne yönelimli (OOP) yapısı, bellek yönetimi ve statik tipli olmasından kaynaklanan kendine has durumlardan beslenir.
İşte en yaygın Java hataları, neden oldukları problemler ve Java kod örnekleriyle doğru çözüm yolları:
1. Milyar Dolarlık Hata: NullPointerException (NPE)
Java'da en sık karşılaşılan çökme sebebidir. Bir nesne referansı henüz bellekte bir yere işaret etmiyorken (null iken), onun metotlarına veya değişkenlerine erişmeye çalışmaktan kaynaklanır.
- Hatalı Yaklaşım:
java
public void printUserCity(User user) {
// Eğer user nesnesi null ise uygulama çöker
System.out.println(user.getAddress().getCity());
}
Kodu dikkatli kullanın.
- Doğru Yaklaşım (Java 8+ Optional Kullanımı):
java
public void printUserCity(User user) {
// Optional ve null-safe kontrollerle çökme engellenir
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("Bilinmeyen Şehir");
System.out.println(city);
}
Kodu dikkatli kullanın.
2. String Karşılaştırmasında == Kullanmak
Java'da == operatörü nesnelerin içeriğini değil, bellekteki referans adreslerini karşılaştırır. Metin içeriklerini kontrol etmek için bu operatörün kullanılması mantıksal hatalara yol açar.
- Hatalı Yaklaşım:
java
String str1 = new String("Merhaba");
String str2 = new String("Merhaba");
if (str1 == str2) {
// İçerik aynı olmasına rağmen bu blok ÇALIŞMAZ (referanslar farklıdır)
System.out.println("Eşit");
}
Kodu dikkatli kullanın.
- Doğru Yaklaşım:
java
if (str1.equals(str2)) {
// İçerikleri güvenli bir şekilde karşılaştırır
System.out.println("Eşit");
}
Kodu dikkatli kullanın.
3. Döngü İçinde Eleman Silerken ConcurrentModificationException Almak
Bir List veya Collection üzerinde standart for-each döngüsüyle dönerken, koleksiyonun içinden eleman silmeye çalışmak Java'nın çalışma zamanı (runtime) mekanizmasını bozar.
- Hatalı Yaklaşım:
java
List names = new ArrayList<>(List.of("Ali", "Veli", "Can"));
for (String name : names) {
if (name.equals("Veli")) {
names.remove(name); // ConcurrentModificationException fırlatır
}
}
Kodu dikkatli kullanın.
- Doğru Yaklaşım (Iterator veya removeIf Kullanımı):
java
// Java 8 ve sonrası için en temiz yöntem:
names.removeIf(name -> name.equals("Veli"));
Kodu dikkatli kullanın.
4. StringBuilder Yerine Sürekli String Birleştirmek (+)
Java'da String nesneleri değiştirilemezdir (immutable). Döngülerin içerisinde + operatörü ile sürekli metin eklemek, bellekte (String Pool) her seferinde yeni bir nesne yaratılmasına neden olur ve performansı ciddi şekilde düşürür.
- Hatalı Yaklaşım:
java
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // Her adımda bellekte yeni bir String nesnesi oluşur (Yavaş)
}
Kodu dikkatli kullanın.
- Doğru Yaklaşım:
java
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
builder.append(i); // Mevcut nesne üzerine yazar (Hızlı ve performanslı)
}
String result = builder.toString();
Kodu dikkatli kullanın.
5. Kaynakları Kapatmayı Unutmak (Memory Leak)
Dosya okuma (FileInputStream), veritabanı bağlantısı (Connection) veya network soketleri gibi harici kaynaklar kullanıldıktan sonra kapatılmazsa sistem kaynakları tükenir (Memory Leak).
- Hatalı Yaklaşım:
java
BufferedReader br = new BufferedReader(new FileReader("dosya.txt"));
System.out.println(br.readLine());
// br.close() çağrılmadı, eğer hata fırlatılırsa kaynak açık kalır.
Kodu dikkatli kullanın.
- Doğru Yaklaşım (Try-With-Resources):
java
// Java 7 ile gelen bu yapı, işlem bitince kaynağı otomatik kapatır
try (BufferedReader br = new BufferedReader(new FileReader("dosya.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
Kodu dikkatli kullanın.
Eğer projeniz için bu standartları otomatikleştirmek isterseniz:
- Kodunuzdaki bu hataları otomatik yakalayan SonarQube veya Checkstyle gibi araçları kullanabilirsiniz.
- Java'daki Multi-threading (Çoklu İş Parçacığı) süreçlerinde yapılan senkronizasyon hatalarını incelemek çok ufuk açıcıdır, araştırmanızı sizlere tavsiye ederim.
- Java 21 ve sonrası ile gelen Virtual Threads mimarisinde dikkat edilmesi gereken güncel hataları da araştırmanızı sizlere tavsiye ederim.