Java Tuzakları – III: İfade mi Cümle mi?

Hiç aşağıdaki durumlardan biriyle karşılaştınız mı?

if(true)
int u = 7;

//ya da

for (int j = 0; j < 10; j++) int k = j; //ya da if(true) int z = 7; //ya da do int r = 7; while(true);

Yukarıdaki koddaki 2, 7, 12 ve 17 nolu satırlar derleme hatası verirler. Eminim kod yazarken bu durumlarla sık sık karşılaşıyorsunuzdur ve ya bu satırları bir bloka koyarak ya da değişken tanımını, örneğin "if" öncesine, tanıtım olarak alarak çözüyorsunuzdur. Şöyle yani:


int u = 0;

if(true)
u = 7;

// ya da

if(true){
int u = 7;
}

Yukarıda gösterilen iki şekilden biriyle bunu çözebiliriz. Fakat nenir bu hatanın sebebi?

Kanımca bu burum, Java'cıların "çözümünü bilip sebebini bilmedikleri" tuzaklardan en birincisi olmaya aday. En azından benim için öyleydi 🙂 Bu tahminimin, bu durumu açıklamak için dillerde "expression" ve "statement" denen ve benim dilimize "ifade" ve "cümle" olarak çevirdiğim iki çok temel yapının tanımının ve aralarınıdaki ilişkilerin genelde çok teorik düzeyde olduğunun düşünülüp çok da iyi kavranmaması şeklindeki tecrübeme dayanıyor. Ola biten şu aslında: Cümle, java'daki en temel çalıştırma birimidir ve daima bir ";" ile biter. Cümle, bir ya da birden fazla ifadeden oluşabilir. Bazen bir cümle bir ifadeden ibaret olur bazen ise birden fazla ifadeyi farklı opertörlerle bir araya getirip daha karmaşık cümleler oluşturursunuz. Bir kaç örnekle açıklayayım:


//Bunlar tek ifadeden oluşan cümlelerdir:
// Tanıtım ifadesi ve aynı zamanda cümlesi (declaration expression)
int u;

// Atama ifadesi ve aynı zamanda cümlesi (assignment expression)
u = 0;

//Bunlar ise birden fazla ifadeden oluşan cümlelerdir:
// Tanıtım ve atama ifadelerini içeren bir cümle
int v =0;

// if ve atama ifadelerini içeren bir cümle
if(vites == 6)
hiz = 0;

Dolayısıyla aşağıdaki gibi bir cümle hem "if" ifadesini hem de kendisi zaten bir cümle olan değişken tanımlama cümlesini bir araya getiriyor. O yüzden derleyici doğrudan "int"in altını çizip bunun fazla olduğunu söylüyor.

if(vites == 6)
int minHiz = 160;

Yaptığımız her şeyin sebebini olabildiğince bilmek, sadece programlama yaparken değil her türlü hareketimizde çok önemli bence. Bol Java'lı günler dilerim 🙂

Bu yazı toplam 901 defa görüntülenmiştir.