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 🙂
Toplam görüntülenme sayısı: 1017
Tufan Barış YILDIRIM
26 Mart 2011 @ 13:16
Merhabalar, konu güzel öncelikle teşekkürler, fakat değinmek istediğim birşey var. Olay sadece ard arda gelebilecek expressionlarla ilgili değildir.Semantik katmanda da bunun bir sebebi var. Her değişkenin sahibi bir scope olmak zorundadır.
“if(true)” ifadesinde süslü parantezler olmadığı zaman kendisinden sonra sadece 1 expression alabilir, bu da değişken tanımlamayı anlamsız kılar ve kendisinden sonra kullanılamaz. parantezleri koyduğumuz zaman yani;
“if(true) { int i = 1; }” bu ifadede ortada bir scope var ve parantezi kapatana kadar bu değişkeni kullanabiliriz. bazı ideler buna uyarı verir, bu değişkeni sonradan kullanamicaksınız der ama derleme başarıyla gerçekleşir. yani açıp kapadığımız parantezler içine yazdığımız bütün ifadeyi tek expressiona çeviriyior. istediğiniz kadar satır yazın .
{ int i = 0; int f = 3; } burda 2 ifadeyi birleştirip tek ifade haline getirdik bunu sağlayan yine parantezlerdir. ve bunun öncesine yazacağımız bir “if” bunun hepsini kapsar, çünkü if kendisinden sonraki ilk ifadeyi kapsar. aşağıdaki kodda daha anlaşılır olacaktır.
{
int i= 0;
}
i = 1; // derleyici buna da hata verir, cünkü hiç bir değişken ait olduğu scope dışında kullanılamaz, (bunu birtek php yapar “global” anahtarı ile ama o da global’i yaparken Object Oriented değildi.)
Umarım yazınıza birşeyler katabilmiişimdir. Tekrar teşekkürler, iyi çalışmalar
Anlata
Akin
26 Mart 2011 @ 15:14
Güzel yorum için teşekkür ederim. Zaten ben ilk başta sorunu scope problemi olarak ele alıyordum. Sonralarda düşününce yazıdaki açıklamayı teknik olarak daha iyi buldum ya da bana öyle geldi. Ama sizin söylediğiniz, aynı olayın diğer vechesi: ” Her değişkenin sahibi bir scope olmak zorundadır.” Hatalı kodda bir scope oluşturulmuyor. Kesinlikle güzel 🙂 Teşekkürler. Size de iyi çalışmalar.
Akin
26 Mart 2011 @ 15:16
Ayrıca bu durum C#’ta da mı böyledir? Sanırım siz ilgileniyorsunuz .NET ile.
Tufan Barış YILDIRIM
26 Mart 2011 @ 16:24
Teşekkürler, evet c#’ta da böyledir. Bunun gibi değinilmesi gereken çok şey var diye düşünüyorum, ve siz bunları bir yazı dizisi haline getiriyorsunuz. bize de kopi peyst düşer artık (: Ellerinize sağlık.
Akin
26 Mart 2011 @ 16:45
Ben vakit buldukça Java tarafıyla ilgili yazmaya alışıyorum. Hatta Türkçe PPT sunumu olarak konuları yayınlıyorum http://www.javaturk.org/?page_id=543 Java dersleri sayfasında.