BİL132 Bilgisayar Programlama II 8. Olağandışı durumlar (exceptions) Hacettepe Üniversitesi Bilgisayar Mühendisliği Bölümü Yüksel Tarhan
Olağandışı durum Kütük bulunamadı Diskte yer kalmadı Nesne referans değişken değeri geçersiz (null) Aritmetik işlemde sıfıra bölme Dizi sınırları dışında erişim Donanım hataları Bellek eşlik denetim (parity) hatası... (ve diğerleri) BİL132 Bahar 2006 2
Olağandışı durum Olağandışı durum (nesnesi): veriler, program mantığı veya donanımda sezilen bir hata nedeniyle Java tarafından üretilen nesne. Hata durumunda: Program hemen sonlandırılsın mı? Hangi özel durumlarda? Hata giderilebilir mi? Hangi tür hatalar giderilmeli? Hatayı hangi birim (sınıf / işlev) ve sistem (kullanıcı /JRE) gidermeli? Hata nerede giderilmeli? BİL132 Bahar 2006 3
Olağandışı durumun sezilmesi Hata sezildiği zaman işlev bir hata nesnesi oluşturur. Bu nesne işletim destek birimine (JRE) gönderilir ( throwing exception ). JRE işletim yığını (RTS) üzerinde çağrılı işlevleri (sondan başa doğru) tarayarak hata çözümleyici (kod) arar. Çözümleyici bulunmazsa program sonlandırılır. Hatanın sezildiği işlev... 3. işlev (metod) 2. işlev (metod) 1. işlev (metod) main BİL132 Bahar 2006 4
Olağandışı durum - aşamalar Hatanın sezilmesi: try Hata nesnesinin oluşturulması JRE tarafından (program dışında) throw (program deyimleriyle) Uyumlu hata çözümleyicinin bulunması : catch Hata giderme sırasında yapılacak temizlik işlemleri : finally BİL132 Bahar 2006 5
Olağandışı durum - aşamalar Aynı işlev içinde: try { // Hata üretme olasılığı olan program deyimleri catch (ExceptionType1 e) { // Bu tür hatayı çözümleyen kod catch (ExceptionType2 e) { // Bu tür hatayı çözümleyen kod... // Diğer hata türlerini çözümleyen kod finally { // Blok sonu temizlik kodu BİL132 Bahar 2006 6
Olağandışı durum - aşamalar Hata sezilmezse: try { xxxxxxxxxxxxx catch (ExceptionType1 e) { catch (ExceptionType2 e) {... finally { xxxxxxxxxxxxxx BİL132 Bahar 2006 7
Olağandışı durum - aşamalar Hata sezilirse: try { xxxxxxxxxxxxx (hata sezilir sezilmez) catch (ExceptionType1 e) { (hata bu türde değilse) catch (ExceptionType2 e) { xxxxxxxxxxxxx... finally { xxxxxxxxxxxxxx Hiçbir noktada yakalanmayan hatalarda finally bloku işletilir; hata nesnesi çağıran işleve iletilir BİL132 Bahar 2006 8
Olağandışı durum özel durumlar İşlevin bir yerinde, try blokunda yakalanamayan bir hata, çevreleyen en yakın try bloku içinde (varsa) yeniden aranır. Daha sonra çağıran program içinde (aynı biçimde) aranır. BİL132 Bahar 2006 9
Olağandışı durum nesne türleri Denetlenen hatalar (checked exceptions): İşlevde bu tür hatalar için çözümleyici yoksa, işlev başlığında throws ifadesi yer almalıdır. (IOException, and InterruptedException). Denetlenen hataların programın bir yerinde mutlaka çözümlenmesi gerekir. Denetlenmeyen hatalar (unchecked exceptions): İşlev başlığında throws ifadesi gerekmez. (RunTimeException and Error) BİL132 Bahar 2006 10
Olağandışı durum nesne türleri Object Throwable Unchecked Exception InterruptedException IOException RunTimeException ParseException IndexOutOfBoundsException ArithmeticException NullPointerException ArithmeticException BİL132 Bahar 2006 11
Runtime hata nesneleri - Örnek public class Zero { public static void main(string[] args) { int numerator = 10; int denominator = 0; System.out.println(numerator/denominator); System.out.println( Bu satır yazılmayacaktır. ); Exception in thread main java.lang.arithmeticexception: / by zero at Zero.main(Zero.java:6) BİL132 Bahar 2006 12
Programa özgü olağandışı durum nesneleri - Örnek Olağandışı durum (hata) sınıfı: public class GarageFull extends Exception { private int capacity; public GarageFull(int s){ capacity = s; //end GarageFull public int getcapacity(){ return capacity; //end getcapacity //end class GarageFull BİL132 Bahar 2006 13
Programa özgü olağandışı durum nesneleri - Örnek Normal program deyimleri public class Garage { private Vehicle[] fleet = new Vehicle[100]; private int count = 0; public void addvehicle(vehicle v) throws GarageFull { if (count = fleet.length) throw new GarageFull(count); else fleet[count++] = v; //end add Vehicle BİL132 Bahar 2006 14
Programa özgü olağandışı durum nesneleri - Örnek Hata çözümleyici... try { mygarage.addvehicle(new Car( ABC123,4)); catch(garagefull gf) { System.err.println( Operation failed ); System.err.println( Capacity is + gf.getcapacity()); //end catch... BİL132 Bahar 2006 15
Programa özgü olağandışı durum nesneleri Örnek 2 public String getmessage() { Hata burada çözümleniyor String msg; boolean ok = false; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(isr); System.out.println( Enter message ); while (!ok){ try { msg = in.readline(); ok = true; //end try catch(ioexception ioe){ System.err.println( Try again ); //end catch //end while return msg; //end GetMessage BİL132 Bahar 2006 16
Programa özgü olağandışı durum nesneleri Örnek 2 public String getmessage() throws IOException { String msg; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(isr); System.out.println( Enter message ); msg = in.readline(); return msg; //end GetMessage BİL132 Bahar 2006 17
Özel durumlar Türetilmiş sınıf işlevi üst sınıflardaki başka bir işlevin yerine yerine geçmişse (overriding), throws ile, yerine geçtiği işlevin belirttiğinden daha fazla hata belirtemez. Class X { void f() throws ExceptionA {... Class Y extends X { void f() throws ExceptionB {... BİL132 Bahar 2006 18
Özel durumlar throws deyimiyle belirli bir E hata nesnesini türeteceği bilinen bir işlev çağırılıyorsa, çağıran işlev: E nesnesini yakalayarak hatayı çözebilir, veya, E nesnesini yakalayarak, kendi throws listesindeki (başka) bir türden hata nesnesini türetebilir, veya Kendi throws listesine E türünü ekleyerek hata ile ilgilenmemeyi seçebilir. BİL132 Bahar 2006 19
Terimler Exception Handler Throw (exception) Catch (exception) olağandışı durum, hata çözümleyici hata nesnesi türetme (hata nesnesi) tutmak BİL132 Bahar 2006 20