- Konu sahibi
- #1
Java’da bir işlemin sonucunu kontrol etmek için önce sonucu bir değişkene atayın, ardından beklenen durumla karşılaştırın. Koşula göre farklı işlem yapılacaksa
Örneğin iki sayının toplamını hesaplayıp sonucun beklenen değere eşit olup olmadığını kontrol edebilirsiniz:
Burada
Metinleri
Sabit metni solda kullanmak,
Bir puanın hangi aralıkta olduğunu kontrol ederken koşulları açıkça sıralayın:
Koşullar yukarıdan aşağıya değerlendirilir ve doğru olan ilk blok çalışır. Bu nedenle daha geniş bir koşulu üstte yazmak, alttaki koşulların hiç çalışmamasına yol açabilir. Örneğin
Sabit seçenekleri kontrol etmek için
Bir Java ifadesinin ürettiği sonuç ile bu sonuca dayanarak verilen karar aynı şey değildir. Örneğin bir bölme işleminin sonucunu kontrol ederken sıfıra bölme ihtimalini işlemden önce ele almak gerekir:
Buradaki kontrol, yalnızca sonucun beklenip beklenmediğini değil, işlemin güvenli biçimde yapılıp yapılamayacağını belirler. Bir hata mesajı görülmesi her zaman Java’nın yanlış hesap yaptığını kanıtlamaz; çoğu zaman girdinin geçersiz olduğunu gösterir. Bu durumda önce kullanılan değişkenlerin değerlerini, türlerini ve hesaplamaya girmeden önceki koşulları kontrol edin.
Ondalıklı sayıları doğrudan
Bu kontrol, iki sayının bilgisayardaki kayan nokta gösterimi nedeniyle oluşabilecek çok küçük farkları göz ardı eder. Tolerans değeri uygulamanın hassasiyetine göre belirlenmelidir; para gibi hassas hesaplarda yalnızca
Sonucu yalnız çalışma sırasında ekrana yazdırmak yerine otomatik testle de doğrulayabilirsiniz. Testte temel ayrım şudur: gerçek sonuç programın ürettiği değer, beklenen sonuç ise testin doğru kabul ettiği değerdir. İki değer uyuşmuyorsa test başarısız olur ve hangi beklentinin karşılanmadığı görülür.
Örneğin hesaplama kodunu ayrı bir metoda taşıyın:
Bu metodu çağırarak önce gerçek sonucu görebilirsiniz:
Beklenen sonuç 20 olduğu için çıktı 20 ise bu örnek için hesaplama doğrudur. Ancak bu, metodun bütün olası girdilerde doğru olduğunu kanıtlamaz. Negatif sayılar, sıfır ve sınır değerleri ayrıca kontrol edilmelidir. Bir test başarısız olduğunda önce beklenen değerin gerçekten doğru yazıldığını, sonra metoda gönderilen girdileri ve en son hesaplama kodunu inceleyin.
Sonuç beklenenden farklıysa geçici olarak girdi, ara değişken ve çıktı değerlerini yazdırabilir veya hata ayıklayıcıda bu satırlara durma noktası koyabilirsiniz. İnceleme bittikten sonra hassas bilgileri içeren geçici çıktıları kaldırın; özellikle parola, erişim anahtarı ve kişisel verileri konsola veya günlük dosyasına yazdırmayın. Böylece yalnız son değeri değil, sonuca götüren adımları da doğrulamış olursunuz.
if-else, birden fazla sabit seçenek varsa switch, programın test aşamasında beklenen ve gerçek değeri karşılaştırmak için ise test doğrulamaları kullanılır. Sonucun yalnız ekrana yazdırılması, doğru olduğu anlamına gelmez; değerin beklenen sonuçla karşılaştırılması gerekir.Sonucu koşula göre kontrol etme
Örneğin iki sayının toplamını hesaplayıp sonucun beklenen değere eşit olup olmadığını kontrol edebilirsiniz:
Java:
public class SonucKontrolu {
public static void main(String[] args) {
int sayi1 = 12;
int sayi2 = 8;
int toplam = sayi1 + sayi2;
if (toplam == 20) {
System.out.println("Sonuç doğru: " + toplam);
} else {
System.out.println("Sonuç beklenenden farklı: " + toplam);
}
}
}
Burada
toplam == 20 ifadesi, toplam değişkeninin 20 olup olmadığını kontrol eder. Sonuç 20 ise ilk blok, değilse else bloğu çalışır. Atama yapmak için kullanılan tek eşittir (=) ile karşılaştırma yapmak için kullanılan çift eşittir (==) birbirine karıştırılmamalıdır.Metinleri
== ile karşılaştırmayın. Java’da metin içeriğini kontrol etmek için equals() kullanılır:
Java:
String durum = "basarili";
if ("basarili".equals(durum)) {
System.out.println("İşlem tamamlandı.");
} else {
System.out.println("İşlem başarısız.");
}
Sabit metni solda kullanmak,
durum değişkeni null olduğunda oluşabilecek NullPointerException riskini azaltır. durum == "basarili" ifadesi içerik yerine çoğunlukla nesne referanslarını karşılaştırdığı için güvenilir değildir.Sonucu aralık veya birden fazla koşulla kontrol etme
Bir puanın hangi aralıkta olduğunu kontrol ederken koşulları açıkça sıralayın:
Java:
int puan = 78;
if (puan >= 85) {
System.out.println("Çok iyi");
} else if (puan >= 70) {
System.out.println("İyi");
} else if (puan >= 50) {
System.out.println("Geçti");
} else {
System.out.println("Kaldı");
}
Koşullar yukarıdan aşağıya değerlendirilir ve doğru olan ilk blok çalışır. Bu nedenle daha geniş bir koşulu üstte yazmak, alttaki koşulların hiç çalışmamasına yol açabilir. Örneğin
puan >= 50 koşulunu en başa yazarsanız 70 veya 85 puan için özel sonuçlara ulaşılamaz.Sabit seçenekleri kontrol etmek için
switch de kullanılabilir:
Java:
String durum = "bekliyor";
switch (durum) {
case "basarili":
System.out.println("İşlem tamamlandı.");
break;
case "bekliyor":
System.out.println("İşlem henüz sonuçlanmadı.");
break;
default:
System.out.println("Bilinmeyen durum.");
}
break yazılmazsa uygun durumdan sonraki case blokları da çalışabilir. Bu davranış özellikle eski switch kullanımında sık görülen bir hatadır.Sonucun ne anlama geldiğini ayırma
Bir Java ifadesinin ürettiği sonuç ile bu sonuca dayanarak verilen karar aynı şey değildir. Örneğin bir bölme işleminin sonucunu kontrol ederken sıfıra bölme ihtimalini işlemden önce ele almak gerekir:
Java:
int bolunen = 10;
int bolen = 0;
if (bolen == 0) {
System.out.println("Bölme yapılamaz: bölen sıfır.");
} else {
double sonuc = (double) bolunen / bolen;
System.out.println("Sonuç: " + sonuc);
}
Buradaki kontrol, yalnızca sonucun beklenip beklenmediğini değil, işlemin güvenli biçimde yapılıp yapılamayacağını belirler. Bir hata mesajı görülmesi her zaman Java’nın yanlış hesap yaptığını kanıtlamaz; çoğu zaman girdinin geçersiz olduğunu gösterir. Bu durumda önce kullanılan değişkenlerin değerlerini, türlerini ve hesaplamaya girmeden önceki koşulları kontrol edin.
Ondalıklı sayıları doğrudan
== ile karşılaştırmak da beklenmeyen sonuç verebilir. Hesaplama sonucunu küçük bir toleransla kontrol etmek daha uygundur:
Java:
double gercek = 0.1 + 0.2;
double beklenen = 0.3;
double tolerans = 0.000001;
if (Math.abs(gercek - beklenen) < tolerans) {
System.out.println("Sonuç kabul edilebilir.");
} else {
System.out.println("Sonuç beklenenden farklı.");
}
Bu kontrol, iki sayının bilgisayardaki kayan nokta gösterimi nedeniyle oluşabilecek çok küçük farkları göz ardı eder. Tolerans değeri uygulamanın hassasiyetine göre belirlenmelidir; para gibi hassas hesaplarda yalnızca
double karşılaştırmasına güvenmek yerine uygun bir sayı gösterimi ve yuvarlama kuralı kullanılmalıdır.Programın sonucunu testle doğrulama
Sonucu yalnız çalışma sırasında ekrana yazdırmak yerine otomatik testle de doğrulayabilirsiniz. Testte temel ayrım şudur: gerçek sonuç programın ürettiği değer, beklenen sonuç ise testin doğru kabul ettiği değerdir. İki değer uyuşmuyorsa test başarısız olur ve hangi beklentinin karşılanmadığı görülür.
Örneğin hesaplama kodunu ayrı bir metoda taşıyın:
Java:
public class Hesaplama {
public static int topla(int a, int b) {
return a + b;
}
}
Bu metodu çağırarak önce gerçek sonucu görebilirsiniz:
Java:
int gercekSonuc = Hesaplama.topla(12, 8);
System.out.println(gercekSonuc); // 20
Beklenen sonuç 20 olduğu için çıktı 20 ise bu örnek için hesaplama doğrudur. Ancak bu, metodun bütün olası girdilerde doğru olduğunu kanıtlamaz. Negatif sayılar, sıfır ve sınır değerleri ayrıca kontrol edilmelidir. Bir test başarısız olduğunda önce beklenen değerin gerçekten doğru yazıldığını, sonra metoda gönderilen girdileri ve en son hesaplama kodunu inceleyin.
| Kontrol yöntemi | Ne zaman kullanılır? | Sonuç ne gösterir? |
|---|---|---|
if-else | Program çalışırken karar vermek için | Koşula göre hangi kodun çalışacağını belirler |
switch | Sabit seçenekleri ayırmak için | Eşleşen seçeneğin davranışını gösterir |
equals() | Metin içeriğini karşılaştırmak için | Metinlerin içerik olarak eşit olup olmadığını gösterir |
| Test doğrulaması | Kodun beklenen çıktıyı üretip üretmediğini sınamak için | Belirli bir girdi ve beklenti için test sonucunu gösterir |
| Hata ayıklama veya günlük kaydı | Ara değerleri incelemek için | Hesaplamanın hangi aşamada beklenenden saptığını gösterir |