İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Java'da Değişken Deklare Etme Ve Atama

Aşağıdaki örnek geçenlerde kafamı karıştıran bir konuyla ilgili yaptığım bir denemedir. Programı derlemeye çalıştığımızda “variable x might not have been initialized” hatası veriyor. Peki neden?

InitDemo.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 class InitDemo{
  2       public static void main(String args[]) {
  3       int x;
  4       try{
  5         x = 6/2; 
  6       }
  7       catch(ArithmeticException exc){
  8       System.out.println("Sıfırıa Bölme Hatası");
  9       System.exit(1);
 10       }
 11      System.out.println(x); // Hata mesaı: "variable x might not have been initialized"
 12     }
 13 }

Bu problemden yola çıkarak Java’da temel, basit ama önemli bir konu olan değişken bildirimi(decleration), tanımlaması(definition) ve ilk değer atama(initialization) konularına kısa bir geri dönüş yaptım.

Bildirim, tanımlama, ilk değer atama:

Java dilinde bildiğimiz gibi;

int x;

gibi bir ifade x isimli bir değişkeni bildiriyor. Yani biz programımızda x isimli bir değişken kullanacağımızı derleyiciye söylüyoruz ancak herhangi bir değer vermemiş oluyoruz. Bu nedenle bellekte herhangi bir hafıza tahsisi(memory allocation) henüz olmuyor.

Ancak;

x = 12;

ifadesini programımıza eklersek burada değişkenimiz bir değer almış oluyor. Yani bellekte integer tipinde bir sayısal değer için yer ayrılıyor, içine 12 değeri yazılıyor ve x değişkeni artık 12 sayısının tutulduğu bellek adresine referans ediyor. “=” ile yapılan iş aslında bundan ibaret. Bu durumda bir definition(tanımlama) söz konusu.

Peki iki satırda yaptığımız bu işlemi tek satırda şu şekilde yaparsak ne olur?

int x = 12;

Sonuç olarak değişen hiçbirşey olmaz. Ancak burada initialization(ilk değer atama) dediğimiz kavram ortaya çıkar. Yani değişken, bildirildiği noktada aynı zamanda tanımlanmış da olur, yani değeri de verilir ve initialize edilir.(ilk değer atanır)

Class içindeki değişkenler

Java dilinde herhangi bir class’ın içindeki üye değişkenlerin eğer sadece bildirimi yapılmış ancak tanımlaması yapılmamışsa(herhangi bir değer verilmemişse) bu değişkenlere otomatik olarak başlangıç değeri verilir. Sayısal değerler için 0, string’ler için “null” değeri atanır. Aşağıdaki örnekle bunu deneyebilirsiniz.

class MyClass{

      int i_int;                       // Nesne yaratıldığında bu değişkenlere
      double d_double;        // default olarak sırasıyla 0, 0.0, 0.0 ve null değerleri
      float f_float;                 // verilir.
      String str;

}

class InitDemo{

      public static void main(String args[]) {

	    MyClass ob = new MyClass();
	    System.out.println(ob.i_int);
	    System.out.println(ob.d_double);
	    System.out.println(ob.f_float);
	    System.out.println(ob.str);
      }
}

Örneği çalıştırdığınızda sayısal değerlerin sıfır, string’in “null” olduğunu göreceksiniz.

Ancak herhangi bir fonksiyon, döngü ya da kontrol ifadelerinin içinde kullanılan yerel değişkenler(local variables) için durum böyle değildir. Java dili bu değişkenlere otomatik olarak bir değer atamaz.

Bu noktada en başta verdiğim örnekteki probleme geri dönelim.

InitDemo class’ının main() metodonun içindeki 3. satıra bakalım. Bu bir bildirim ifadesidir. Programımızda x isimli bir değişken kullanacağımızı haber veriyoruz. Ancak bir değer falan vermemişiz. Değişkenin değerini 5. satırdaki ifadeyle veriyoruz(değişken tanımlama olayı gerçekleşiyor). Bu durumda x’in değeri 3 olmalı. Buraya kadar herşey teorik olarak doğrudur. Bir değişken bildiriyoruz, ona değerini veriyoruz ve 11. satırda içeriğini ekranda göstermek istiyoruz. Herşey mantıklı… Ancak programı derlediğimizde 11. satırda hata alıyoruz.

Peki neden? Sebep “try” bloğu…

X değişkeninin değerini try bloğunun içinde vermek istiyoruz. Peki try bloğunun içinde bir istisna(exception) olsaydı da x değişkenine değer verilemeseydi ne olurdu? O zaman x değişkenine programın hiçbir yerinde değer verilemeyecekti. Bu nedenle 11. satırdaki kod hata üretecekti.

Problemin nedenini biraz daha netleştirelim. Mesela programımızda bir “y“ değişkenimiz olsaydı ve try bloğunun içinde de x değişkenine değer vermeden önce y üzerinde birtakım işlemler yapmış olsaydık ve bu işlemler esnasında bir exception meydana gelseydi o zaman program otomatik olarak catch bloğuna atlayacaktı ve x değişkeni değerini alamayacaktı. Catch bloğunda da programı sonlandırmak yerine sadece uyarı mesajı verip programa devam etmek isteseydik 11. satırda x değişkeni değer verilmeden kullanılmak isteneceğinden hata meydana gelecekti.

İşte bu yüzden iki olası durum var. try bloğunda herhangi bir problem olmadan x değişkeni değerini normal bir şekilde alabilir ve 11. satırda da problem çıkmaz. İkinci olasılık try bloğunda bir exception meydana gelebilir, x değişkeni değerini alamaz, program hata verir.

“Ancak bu tür durumlar çalışma zamanı istisnaları dediğimiz (run-time exception) durumlara girer derleme zamanında niye problem oluyor?” diyebilirsiniz. Java derleyicisi güvenlik ve muhtemel hataların önceden tespiti konusundaki hassaslığını burada gösterir. Çalışma zamanında oluşabilecek bu tür bir hataya karşı derleme işlemini gerçekleştirmez.

Zaten hata mesajına baktığımızda durum hakkında bize ipucu veriliyor.

“variable x might not have been initialized”.

“x değişkenine ilk değer verilememiş olabilir” diyor. Yani program çalıştığında değer alabilir de alamayabilir de. Ortada yüzde yüz kesin bir durum yok.

Bu tip muhtemel hata durumu sadece try-catch bloğuna has değildir. Aşağıdaki örneğe bakalım;

{
int x;
int k = 5;
…
…
…
…

if( k < 2 ){
	x = 16;
}
…
…
…

System.out.println(x);
}

Burada durum daha açık görülüyor. k’nın değeri 2’den küçük olmadığı için if bloğu çalışmayacak, x değişkeni 16 değerini alamayacak ve “System.out.println(x);” ifadesinde hata meydana gelecektir. k’nın değeri küçük olsaydı problem yoktu. Bu tip oluşması muhtemel hataları Java derleyicisi çalışma zamanına bırakmıyor. Derleme anında yakalayıp hata riskini azaltmaya çalışıyor.

Bazen temel ve basit diye düşündüğümüz konular(ki gerçekten basit bir konu da olabilir) önemli kavramlar ve mantıklar içerir. Bence bu durum da buna bir örnek…

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır