y ca de m Java ile Nesne Merkezli ve Fonksiyonel Programlama w w w .s el so f t.a 7. Bölüm Sıra Dışı Durum Yönetimi (Exception Handling) Akın Kaldıroğlu www.javaturk.org Aralık2016 ca de m y Küçük Ama Önemli Bir Konu Ø Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm w Ø w Ø w .s el so f Ø t.a Ø haklarıSelsoft Yazılım,Danışmanlık,EğitimveTic.Ltd.Şti.’ne aittir. Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla kullanabilirsinizveisteyenlerihttp://www.selsoft.academy adresine yönlendirip,bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz. Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticari olsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması, buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyada sanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalinde lütfenbenimle,[email protected] adresindeniletişimegeçin. Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeve eleştirilerinizibanailetmekistersenizçoksevinirim. BolJava’lıgünlerdilerim. www.selsoft.academy 2 ca de m y İçerik Ø Bubölümde şu konular ele alınacaktır: t.a Ø Geleneksel sıra dışı durumyönetimi, Ø Java’da sıra dışı durumyönetimi, so f Ø Throwable sınıf hiyerarşisi, Ø Exceptionve Errorsınıfları, savunmacı programlama, Ø Sıra dışı durumyönetiminin eniyi kullanımları. w w w .s el Ø assertanahtar kelimesi ve www.selsoft.academy 3 y ca de m t.a w w w .s el so f Sıra Dışı Durum (Exception) www.javaturk.org 4 y ca de m SıraDışıDurumNedir? Ø Yazılımdasıradışı durum (exception),normalçalışmadan birsapmadır. w .s el so f t.a Ø Sıradışıdurumlar,yazılımlarınçalışmasısırasında,icra edilensüreçlerdebeklenen veolmasıgerekenlerdışında meydanagelenanormalhallerdir. Ø Kredikartıylaödemeyaparkenkartınlimitininyetmemesi bir sıradışıdurumdur. w w Ø Yazılımlarabuhalleriyönetmekiçinyapılarbulunur. Ø Buyapılarasıradışı durumyönetimi (exception handling) denir. www.javaturk.org 5 ca de m y SıraDışıDurumNedenOlur? w w w .s el so f t.a Ø Önemliolansıradışıdurumlardankaçınmakdeğildir,çünkü sıradışıdurumlaraslındaokadardasıradışıdeğildir,işin birparçasıdır: Ø Kredikartıylaödemeyaparkenkartınlimitininyetmemesi, Ø Birdosyayıaçmayaçalışırkenaçmayetkisinesahip olunmadığınınortayaçıkması, Ø Başvuruyaparkenbirbilginineksikolması Ø gibidurumlar,aslensüreçlerintabiparçasıolanalternatif hallerdir. Ø Yanlışolan,işveihtiyaçanalizisırasındasüreçler detaylandırılırkenbudurumlarınhiçdüşünülmemesidir. www.javaturk.org 6 ca de m y SıraDışıDurumOlduğunda Ø Önemliolansıradışıdurumoluştuğundayazılımınnasıl devamedeceğidir. Dosyabulunamadığındayenibirdosyaismisormakörneğin. w .s Ø el so f t.a Ø Yazılımlardasıradışıdurumoluştuğundatemeldeiki seçeneksözkonusuolur: Ø Durumukullanıcıyabildirmekveonunkararınagöredevam etmek: Ø Kararalıp,kullanıcıdanbirinisiyatifalmasınıbeklemedenve Dosyabulunamadığındayenibirdosyaoluşturupdevametmek. w Ø w onahissettirmedençalışmayadevametmek. www.javaturk.org 7 y ca de m SıraDışıDurumYönetimi w w w .s el so f t.a Ø Sıradışıdurumyönetiminintemelkavramlarışunlardır: Ø Sıradışıdurum(exception):Sıradışıdurumunkendisidir. Durumileilgilibilgileridetaşır. Ø Fırlatma (throw):SıradışıdurumuoluşturupJVM’e bildirmektir. Ø Yükseltme (raise):Sıradışıdurumubirüstbağlama göndermektir. Ø Yakalama (catch,handle):Fırlatılansıradışıdurumun, yönetilmeküzereözelbirkodparçasınagirmesidir. Ø Çağrızinciri(call chain):Metotlarınbirbirlerini çağırmalarındandoğanzincirdir. Ø Yığınizi(stack trace):Herhangibirandaaktifolanmetot pencerelerinin(method frame)yığındakidurumudur. www.javaturk.org 8 y ca de m SıraDışıDurumveHata Ø Javaaçısındansıradışıdurum,hata (error)değildir. w w w .s el so f t.a Ø Hatahangisebepleolursaolsun,geneldegeridönüşü olmayanbirdurumdur. Ø Yazılımlardafarklıtiptehatalarsözkonusudur: Ø Derlemehataları:Sözdizimi(syntax)hatalarıdır. Ø Çalışmazamanıhataları:Programınçalışmasısırasındaolan hatalardır:JVM’deki birdurumdankaynaklananhata,“out of memory”gibibellekhataları,vs. Ø Mantıkhataları:Yazılımınsüreçlerindekihatalardırve“bug” olarakadlandırılır.Buhatalartamamenyazılımtakımının sorumluluğundadır. www.javaturk.org 9 ca de m y MantıkHataları w .s el so f t.a Ø Mantıkhatalarınınbirkısmıişmantığıylailgilidir: Ø Satınalınanmalın,kupon,indirim,vergivs.densonrakifiyatını yanlışhesaplamakbucinsten,“bug”deninceaklagelen hatalardır. Ø Bazımantıkhatalarıiseişmantığındanziyade, programlamadiliyapılarıylailgilidir: Ø null olanbirreferansınüzerindemetotçağrısıyapmak, Ø n odayasahipbirdiziden. odayaulaşmayaçalışmak. w w Ø Butürdenhatalar,doğrudanprogramcınınhatasıdırve düzeltilmelidir. www.javaturk.org 10 y ca de m t.a w w w .s el so f Geleneksel Sıra Dışı Durum Yönetimi www.javaturk.org 11 ca de m y GelenekselSıraDışıDurumYönetimi so f t.a Ø Hertüryazılımdasıradışıdurumlarsözkonusudurve yönetilmelidir. Ø Dillerdebutürdurumlariçinözelyapılarolmasabile programatikolaraksıradışıdurumlartespitedilipyönetilir. Ø Aşağıdakigibibir“readFile()” metoduolsun: w w w .s el // Pseudo code readFile (fileName) { open the file; determine its size; allocate that much memory; read the file into memory; edit the file; save the file; close the file; } www.javaturk.org 12 ca de m y MuhtemelSıraDışıDurumlar w .s el so f t.a Ø Verilenörnekteaşağıdakisıradışıdurumlarsözkonusu olabilir: Ø Dosyaaçılamazsa? Ø Dosyanınboyutubelirlenemezse? Ø Dosyayıaçmakiçinyeterincebellekyoksa? Ø Dosyabelleğeokunurkenproblemçıkarsa? Ø Dosyakapatılamazsa? w w Ø Tümbu“readFile()” metodundaolabileceksıradışı durumlardırvegelenekselşekildedeolsayönetilmelidir. www.javaturk.org 13 ca de m y Ø Gelenekselsıradışıdurumyönetimi,int yadaStringhata kodlarıüzerindenvegenelmekanizmalarlayapılır. w w w .s el so f t.a // Pseudo code errorCodeType readFile { initialize errorCode = 0; open the file; if (fileIsOpen) { determine the length of the file; if (gotTheFileLength) { allocate that much memory; if (gotEnoughMemory) { read the file into memory; if (readFailed) { errorCode = -1; } // Can’t read } else { errorCode = -2; } // Not enough memory } else { errorCode = -3; } // File length unavailable close the file; if (fileDidntClose && errorCode == 0){ errorCode = -4; } else { errorCode = errorCode and -4; } } else { errorCode = -5; } // File can’t open return errorCode; } www.javaturk.org 14 ca de m y // Pseudo code method1 { errorCodeType error; error = call method2; if (error) doErrorProcessing; else proceed; } errorCodeType method2 { errorCodeType error; error = call method3; if (error) return error; else proceed; } w w w .s el // Pseudo code method1 { call method2; } method2 { call method3; } method3 { call readFile; } so f t.a Ø “readFile()”metodunun aşağıdakigibibirmetotzincirde çağrıldığınıdüşünün. Ø readFile() metodununfırlattığı sıradışıdurumkodunun method3() vemethod2() üzerindenmethod1()’e yükseltildiği durumdayandakigibi birkodyapısısözkonusuolacaktır. www.javaturk.org errorCodeType method3 { errorCodeType error; error = call readFile; if (error) return error; else proceed; } 15 ca de m y GelenekselYaklaşımınProblemleri so f Ø Sıradışıdurumunfarkedilmesi,oluşturulması,yığındakimetotlara ulaştırılmasıveyakalanması,tamamendildekigenelyapılarla halledilir. Budurumprogramlarıdahakarmaşıkveanlaşılmazkılar. el Ø t.a Ø Gelenekselsıradışıdurumyönetimininenproblemliiki özelliğişunlardır: Ø Dildesıradışıdurumyönetimininmekanizmalarıyoktur, yönetimtamamenprogramyazanlartarafındankurgulanır. w .s Ø Sıradışıdurumlarancakint yadaString tipindedeğişkenlerle ifadeedilirler. w Budaprosedürel yapılarınentemelproblemiolan“anlam” probleminitekrargündemegetirir. w Ø www.javaturk.org 16 y ca de m t.a w w w .s el so f Java’da Sıra Dışı Durum Yönetimi www.javaturk.org 17 ca de m y Java’daSıraDışıDurumYönetimi- I so f t.a Ø Java,nesne-merkezlibirdilolarak, sıradışıdurumlarahaskontrolyapısı vesıradışıdurumlariçin oluşturduğunesnehiyerarşisiilesıra dışıdurumyönetimisağlamaktadır. w w w .s el Ø Örnekolarakelealınan “readFile()” metodununJava’nın sıradışıdurumyönetimi çerçevesindekavramsalolarakşöyle olduğunudüşünülebilir: // Pseudo code method1 { call method2; } method2 { call method3; } method3 { call readFile; } www.javaturk.org 18 t.a // Pseudo code readFile { try { open the file; determine its size; allocate that much memory; read the file into memory; close the file; }catch (fileOpenFailed){ doSomething; }catch (sizeDeterminationFailed){ doSomething; }catch (memoryAllocationFailed){ doSomething; }catch (readFailed){ doSomething; }catch (fileCloseFailed){ doSomething; } ... } w w w .s el so f Ø Java’dasıradışıdurum yönetimiiçintry-catch bloğukullanılır. Ø Sıradışıdurum fırlatmaihtimaliolan kodtry bloğunda, fırlatılabileceksıradışı durumlarıyakalayacak kodisecatch bloğuna konur. ca de m y Java’daSıraDışıDurumYönetimi- II www.javaturk.org 19 // Pseudo code readFile throws fileOpenFailed, sizeDeterminationFailed, memoryAllocationFailed, readFailed, fileCloseFailed { open the file; determine its size; allocate that much memory; read the file into memory; close the file; } w w w .s el so f t.a Ø Yadasıradışıdurumu yakalamayı-yönetmeyip,bir üstbağlamayükseltmekde sözkonusuolabilir. Ø Budurumdatry-catch bloğu kullanılmaz,oluşabileceksıra dışıdurumlarmetodun arayüzündelistelenirki,bu metoduçağıranlaryakalamak yadayükseltmektenbirini seçebilsin. Ø Bununiçinthrows anahtar kelimesikullanılır. ca de m y Java’daSıraDışıDurumYönetimi- III www.javaturk.org 20 ca de m y Java’daSıraDışıDurumYönetimi- IV // Pseudo code method1 { try { call method2; } catch (exception){ doExpProcessing; } } w w w .s el so f t.a Ø Metotlarsıradışıdurum fırlattıklarınıthrows ifadesiyle belirtirler. Ø readFile() metodunun fırlattığısıradışıdurumun method3() vemethod2() üzerindenmethod1()’e yükseltildiğidurumdayandaki gibibirkodyapısısözkonusu olacaktır. Ø Budurumdasıradışıdurumu yakalayanveyöneten method1()’dir. www.javaturk.org method2 throws exception{ call method3; } method3 throws exception{ call readFile; } 21 ca de m y Java’daSıraDışıDurumYönetimi- IV // Pseudo code method1 { call method2; } w w w .s el so f t.a Ø Sıradışıdurumumethod1() yerinemethod2() yakalarsakod yandakigibiolur. Ø Dolayısıylasoruşudur: Sıradışı durumukimyakalar? Ø Sıradışıdurumukimleryükseltir (raise)? Ø Sıradışıdurumuyakalayan,o durumudüzeltmekiçinbilgiye sahipolandır. Ø Diğerleriisesıradışıdurumu, yakalayanayükseltirler. www.javaturk.org method2 { try { call method3; } catch (exception){ doExpProcessing; } } method3 throws exception{ call readFile; } 22 y ca de m t.a w w w .s el so f java.lang.Throwable Sınıfı ve Hiyerarşisi www.javaturk.org 23 t.a Ø Java’nınhatavesıradışı durumlarlailgilinesneleri yandakigibidir. ca de m y Java’daHataveSıraDışıDurum so f Ø Hatavesıradışıdurumların atasıThrowable sınıfıdır. w w w .s el Ø Hatalar java.lang.Error sınıfıyla,sıradışıdurumlarise java.lang.Exception sınıfıylaifadeedilir. www.javaturk.org 24 ca de m y Throwable Ø Java’datümhatalarvesıradışıdurumlar java.lang.Throwable sınıfıylatemsiledilir. t.a Ø Throwable isimolarakbirarayüzgibigörünmesine so f rağmenbirsınıftır. w .s el Ø İsterJVMtarafındanisterkodiçindeprogramatikolarak fırlatılsın,Java’dafırlatılantümnesnelerbusınıfınyadaalt sınıflarınınbirnesnesiolmakzorundadır. w w Ø Throwable’ın sadeceikitanealtsınıfıvardır:Error ve Exception www.javaturk.org 25 y ca de m Throwable API- Kurucular Ø Throwable sınıfının5tanekurucusuvardır. so f Throwable() t.a Ø Ensıkkullanılan4kurucumetoduşunlardır: el Throwable(String message) w .s Throwable(Throwable cause) w w Throwable(String message, Throwable cause) www.javaturk.org 26 y ca de m Throwable API:Metotlar Ø Throwable nesnesiyakalanıncaüzerindemetotlar yardımıylabazıbilgilereulaşılır: t.a String getMessage() String getLocalizedMessage() so f void initCause(Throwable t) el Throwable getCause() w .s void printStackTrace() w void printStackTrace(PrintStream s) w void printStackTrace(PrintWriter s) StackTraceElement[] getStackTrace() www.javaturk.org 27 y ca de m StackTraceExample.java Ø Örneğiönce“throwable.printStackTrace();”satırıolmadan çalıştırın. w w w .s el so f t.a Ø Sonra“throwable.printStackTrace();”satırıetkiniken çalıştırınveyığınlaalakalıbilgiyialdığınıznoktadanitibaren geriyedoğru,çalışmanınenbaşınakadar,oandayığında olanmetotlarınnasılsıralandığınadikkatedin. www.javaturk.org 28 y ca de m throw AnahtarKelimesi Ø Throwable sınıfınınnesnelerifırlatılır. so f t.a Ø Buamaçlathrow anahtarkelimesikullanılır. Ø throw anahtarkelimesi,Throwable sınıfınınyadaalt sınıflarındanbirisininnesnesiniargümanolarakalır. Yada w .s el Throwable throwable = new Throwable(“Just kidding!”); throw throwable; w w throw new Throwable(“Just kidding!”); www.javaturk.org 29 ca de m y Throwable FırlatılıncaNeOlur?-I so f Öylekibumetoduçağıranlar,budurumunolabileceğinden haberdarolsunlar, el Ø t.a Ø Varolansıradışıdurumuthrow ileThrowable sınıfınınyada altsınıflarındanbirisininnesnesinifırlatarakifadeedenkod parçasıiçinşuikidurumdanbirisisözkonusudur: Ø İçindebulunulanmetodunarayüzünde budurumunyanibir Throwable nesnesininfırlatıldığınınbelirtilmesi, Ø FırlatılanThrowable nesnesininyakalanıpgereğinin w .s yapılması. w w Ø Buikidurumdanilkine,yükseltme (raising yada propogating),ikincisinedeyakalama (catching)denir. www.javaturk.org 30 ca de m y Yükseltme(Raising-Propogating)- I w .s el so f t.a Ø BirmetottafırlatılanThrowable nesnesinin,ometotta yakalanmayıpbirüstbağlamayükseltilmesi(raising), fırlatılannesneninmetodunarayüzünde throws anahtar kelimesikullanarakifadeedilmesiyleolur. Ø Birüstbağlam, Throwable nesnesinini fırlatanmetodu çağıranveyığında(stack)biralttayadaçağrızincirinde(call chain)birüsttebulunanmetottur. w w public static void throwAThrowable() throws Throwable { Throwable throwable = new Throwable("Just kidding!"); throw throwable; } www.javaturk.org 31 ca de m y Yükseltme(Raising-Propogating)- II Ø Budurumdaüstbağlamdaaynıikiseçeneğesahiptir: Yükseltmekveyayakalamak. el so f t.a Ø Yanimetotlar,çağırdıklarımetotlarınkendilerineyükselttikleri Throwable nesnesinibirüstbağlamayükseltebilirler. Ø Yadayakalarlar. w w .s Ø EğerfırlatılanThrowable nesnesiniçağrızincirindekihiçbir metotyakalamazsaJVMçalışmasınıdurdurur. w Ø DolayısıylafırlatılanThrowable nesnesimuhakkakyakalanmalıdır. www.javaturk.org 32 y ca de m RaisingExample.java Ø Programçalıştığındaekranabasılançıktıyadikkatedin. t.a Ø “After doSomething()”yazıldımı? w w w .s el so f Ø “throw throwable;”satırınıkaldırıptekrarçalıştırın,farkı gözlemleyin. www.javaturk.org 33 y ca de m Yakalama(Catching) t.a Ø throw ileThrowable sınıfınınyadaaltsınıflarından birisininnesnesinifırlatankodparçasıiçinsözkonusuikinci durum,fırlatılannesneyiyakalamaktır. so f Ø Buamaçlatry - catch bloğukullanılır. w w w .s el private static void doSomething() { try { doSomethingElse(); } catch (Throwable e) { System.out.println("Catching a Throwable"); } } www.javaturk.org 34 ca de m y try-catch Bloğu Ø Throwable nesnesinifırlatankodparçası try blokunda t.a bulunur,fırlatılannesnenintipindeargümanasahipcatch blokuisehemenardındangelir. el so f Ø Throwable sınıfınınaltsınıflarısözkonusuolduğunda birdenfazlafarklıThrowable nesnesifırlatılabilir. w .s Ø Budurumdabirdenfazlafarklıtiptenesneyiyakalamakiçin birdenfazlacatch bloğualtaltabulunabilir. w w Ø try ilecatch vebirdenfazlaolduğudurumdacatch blokları arasınabaşkabirkodbloğugiremez. www.javaturk.org 35 y w w w .s el so f t.a ca de m CatchingExample.java www.javaturk.org 36 y ca de m t.a w w w .s el so f java.lang.Error Sınıfı www.javaturk.org 37 ca de m y Error Ø java.lang.Error sınıfı,uygulamalarınyakalayıp so f t.a düzeltmeyeçalışmayacağıciddihatalarıifadeeder. Ø Biruygulamadahiçbirşekildebutiptenbirnesnenin oluşmasınaizinverilmemelidir. Ø AmaoluşanError nesneleriniyakalamaksözkonusu değildir. w .s el Ø ÇünkübusınıfınnesneleriniJVMfırlatır. w w Ø BirmetodunfırlattığıError nesnelerinithrows ifadesiyle belirtmesigerekmediğigibibutiptennesnelerintry-catch ileyakalanmasıdagerekmez. www.javaturk.org 38 y ca de m w w w .s el so f t.a ErrorExample.java www.javaturk.org 39 ca de m y JavaAPI’sindekiError Sınıfları- I Ø Error sınıfları,herpaketteayrıbirbaşlıkaltındasıralanır. t.a Ø JavaAPI’sindeExceptionsınıflarındansonragelir. Ø java.lang paketindekibazıError sınıflarışunlardır: so f Ø AbstractMethodError: Soyutbirmetoduçağırmaya w w w .s el çalıştığınızdaoluşur.Normaldeçalışmazamanındayakalanır amabazendahaöncesomutolanbirmetodusoyutyaparak sınıfıtekrarderleyipkullanmayaçalışıldığındaoluşur. Ø NoSuchFieldError veNoSuchMethodError AbstractMethodError gibi,birsınıf,eskidurumlauygun olmayanbirşekildedeğiştirilip,derlenipkullanıldığında oluşur. www.javaturk.org 40 ca de m y JavaAPI’sindekiError Sınıfları- II Ø NoClassDefFoundError: Yükleneceksınıf w w w .s el so f t.a bulunamadığındafırlatılır. Ø VirtualMachineError: JVM’in çalışmasısırasında oluşanhatalıdurumlariçinfırlatılır. Ø StackOverflowError: Yığının(stack),yenibirmetot çağrısıiçingereklibelleğesahipolmadığındafırlatılır. Ø OutOfMemoryError: Heapin,yenibirnesneyaratmakiçin gereklibelleğesahipolmadığındafırlatılır. www.javaturk.org 41 y ca de m t.a w w w .s el so f java.lang.Exception Sınıfı www.javaturk.org 42 ca de m y Exception Ø java.lang.Exception sınıfı,yakalanmasıdüşünülenher türlüsıradışıdurumutemsileder. so f t.a Ø UygulamalardaoluşansıradışıdurumlaryaException sınıfınınyadaaltsınıflarınınnesnesiolarakfırlatılır. el Ø Exception nesneleriJVMtarafından,JavaAPI’sininbir w .s parçasıolanmetotlardafırlatılabildiğigibiprogramatik olarakdaoluşturulupfırlatılabilir. w Ø İkincihaldeExceptionsınıfınınaltsınıflarınınoluşturulmasıda w sözkonusudur. www.javaturk.org 43 y ca de m ExceptionAPI:Kurucular Ø Exception sınıfınınvarsayılandahil5tanekurucusu el so f t.a vardır. Ø Ensıkkullanılan,sıradışıdurumubetimleyenString parametrealankurucudur. Ø BazenbirException nesnesininyakalanıp,birbaşka Exception nesnesinioluşturmaktakullandığıdagörülür. w .s Exception(String message) Exception(Throwable cause) w w Exception(String message, Throwable cause) www.javaturk.org 44 y ca de m ExceptionAPI:Metotlar Ø Exception nesnesiyakalanıncaüzerindemetotlar yardımıylabazıbilgilereulaşılır: t.a String getMessage() so f String getLocalizedMessage() el Throwable getCause() w .s void printStackTrace() w void printStackTrace(PrintStream s) w void printStackTrace(PrintWriter s) www.javaturk.org 45 ca de m y JavaAPI’sindekiExceptionSınıfları- I Ø Exceptionsınıfları,herpaketteayrıbirbaşlıkaltında, sınıflardanveenumlardan sonrasıralanır. t.a Ø java.lang paketindekibazıException sınıflarışunlardır: so f Ø java.lang.ClassCastException: Nesnelerinyanlış w w w .s el altsınıfadönüştürülmelerinde(down cast)fırlatılır. Ø java.lang.IndexOutOfBoundsException: Stringya dadizi(array)gibiyapılardayanlışerişimiifadeeder. Ø java.lang.NumberFormatException: GirilenString nesnesininsayıformatınadönüştürülmesisırasındaoluşan sıradışıdurumlarıifadeeder. www.javaturk.org 46 ca de m y JavaAPI’sindekiExceptionSınıfları- II w w w .s el so f t.a Ø DiğerpaketlerdekibazısıkkullanılanException sınıfları: Ø java.io.IOException: JVMiledışdünyaarasındaki giriş-çıkışişlemlerisırasındaoluşansıradışıdurumlariçindir. Ø java.sql.SqlException: JVMileveritabanıarasındaki iletişimsırasındaoluşansıradışıdurumlariçindir. www.javaturk.org 47 y ca de m ExceptionExample1.java Ø Önce“openFile()”metodunuçalıştırın. el so f t.a Ø Sonra“openFile()”metodunukaldırıp“openAndCloseFile()” metodunuçalıştırın. Ø “openAndCloseFile()”metodundaikitanecatch bloku olduğunadikkatedin. w .s Ø Sonradaikimetoduarkaarkayaçalıştırın. w w Ø Geçerlivegeçersizgirdilerverereksıradışıdurumun fırlatıldığıvefırlatılmadığıhallerigözlemleyin. www.javaturk.org 48 y ca de m t.a w w w .s el so f try-catch ile Sıra Dışı Durum Yönetimi www.javaturk.org 49 ca de m y try-catch BloğuveException- I Ø Exception nesnesinifırlatankodparçasıtry blokunda t.a bulunur,fırlatılannesnenintipineuygunargümanasahip catch bloğuisehemenardındangelir. so f Ø Exception sınıfınınaltsınıflarısözkonusuolduğunda birdenfazlafarklıException nesnesifırlatılabilir. w .s el Ø Budurumdabirdenfazlafarklıtiptenesneyiyakalamakiçin birdenfazlacatch bloğualtaltabulunabilir. w w Ø try ilecatch vebirdenfazlaolduğudurumdacatch blokları arasınabaşkabirkodbloğugiremez. www.javaturk.org 50 ca de m y try-catch BloğuveException- II Ø Eğertry bloğuvarsaenazbirtanecatch bloğuolmalıdır. so f t.a Ø Eğerkodtry bloğunagirerse,sıradışıdurumoluşmazsaakış catch bloğunagirmez,normalçalışmadevameder. w .s el Ø Eğerkodtry bloğunagirersevesıradışıdurumoluşursa, akışvarolancatch bloklarındanbirtanesinedallanır. w w Ø Dallanılan catch bloğu,fırlatılannesnenintipindenyada uygunüstsınıfındannesneyiargümanolarakalmalıdır. www.javaturk.org 51 ca de m y try-catch BloğuveException- III t.a Ø BirException nesnesiiçinsadecevesadecebircatch bloğunadallanmaolabilir. Ø catch bloğuargümanolarak Exception nesnesialanbir metotgibidüşünülebilinir. w w w .s el so f try { // Code that might generate exceptions } catch(Type1 id1) { // Handle exceptions of Type1 } catch(Type2 id2) { // Handle exceptions of Type2 } catch(Type3 id3) { // Handle exceptions of Type3 } www.javaturk.org 52 y ca de m DivisionByZero1.java Ø “divide()”metodunuönceikinciargümanı“0”olmayacak şekilde,örneğin“divide(20,5)”çağırın. w w w .s el so f t.a Ø Sonraikinciargümanı“0”olacakşekilde,örneğin “divide(20,0)”çağırın. Ø BudurumdafırlatılanArithmeticException nesnesini yakalayacakşekildeörneğideğiştirin=>DivisionByZero2.java www.javaturk.org 53 y ca de m DivisionByZero2.java Ø DivisionByZero2,DivisionByZero1’insıradışıdurum yönetiminiiçerenhalidir. so f t.a Ø “divide()”metodunuönceikinciargümanı“0”olmayacak şekilde,örneğin“divide(20,5)”çağırın. w w w .s el Ø Sonraikinciargümanı“0”olacakşekilde,örneğin “divide(20,0)”çağırın. www.javaturk.org 54 ca de m y try-catch BloğuveException- III el so f t.a Ø FırlatılanException nesnesineuyguntiptebircatch bloğu bulunamazsa,bulununcayakadararamayadevamedilir. Ø Bu,sıradışıdurumunmetotlararasında, yığındaenyukarıdan enaşağıyadoğrugezdirilmesidir(propagating). Ø Budurumdametodun,yakalanmasıgerekipdeyakalanmayan nesneyi“throws”ifadesiilebelirtmesigereklidir. w w w .s Ø Buaramada-gezdirmedeöncetry bloğunutakipedencatch bloklarısorgulanır,uyguncatch bloğubulunamazsa,birüst bağlamolançağıranmetodageçilirveaynıaramaoradada yapılır. www.javaturk.org 55 ca de m y try-catch BloğuveException- IV so f t.a Ø Eğerçağrızincirindekitümmetotlararandığıhaldefırlatılan Exception nesnesineuygunbircatch bloğu bulunamamışsabudurumdaJVMçalışmasınıdurdurur (JVMcrashes and exits). w w w .s el Ø YaniJava’nınsıradışıdurumlarıyokgörülemez,muhakkak yakalanmalıvegereğiyerinegetirilmelidir. www.javaturk.org 56 y ca de m ExceptionExample2.java w w w .s el so f t.a Ø “openAndCloseFile()”metodundafırlatılanikifarklı Exception nesnesininikifarklıyerdeyakalandığınadikkat edin. www.javaturk.org 57 ca de m y try-catch BloğuveException- IV so f t.a Ø FırlatılanbirdenfazlaException nesnesiolduğunda birdenfazlacatch bloğuolabileceğigibi,birmetotthrows ilebirdenfazla Exception nesnesinifırlatacağını belirtebilir. Ø Budurumdafırlatılannesnenintipleri,throws anahtar kelimesindensonravirgülilelistelenir. private static void openAndCloseFile(String path) } w w w .s el throws IOException, FileNotFoundException { File file = new File(path); // throws FileNotFoundException InputStream in = new FileInputStream(file); System.out.println("File opened!"); in.close(); // throws IOException System.out.println("File closed!"); www.javaturk.org 58 y ca de m ExceptionExample3.java Ø “openAndCloseFile()”metodununnasılbirdenfazlasıradışı durumfırlattığınıgözlemleyin. w w w .s el so f t.a Ø Budurumda“openAndCloseFile()”metodununçağrıldığı yerdebirdenfazlacatch bloğuolabilir. www.javaturk.org 59 ca de m y try-catch BloğuveException- V so f t.a Ø “FırlatılanException nesnesineuyguntiptebircatch bloğubulunamazsa,bulununcayakadararamayadevam edilir.”dendi. Ø “FırlatılanException nesnesineuyguntiptebircatch bloğu” nedemektir? w w w .s el Ø JavaAPI’siiçerisindeException sınıfınınpekçokaltsınıfı vardır. Ø Yenilerinidesizoluşturabilirsiniz. www.javaturk.org 60 y ca de m YerineGeçebilme- I t.a Ø Yerinegeçebilme(substitutability)özelliğindendolayı,her sıradışıdurumnesnesi,üstsınıfındanbirnesnebekleyen bağlamdakullanılabilir. w .s Hersıradışıdurumnesnesi, üstsınıfındanbirnesnekabuleden catch bloğutarafındanyakalanır. w w Ø el so f Ø Bucümleninbirkaçfarklısonucuvardır,ilki: 1. Bircatch bloğu,aldığıException nesnesivetümalt sınıflarınınnesneleriniyakalar. www.javaturk.org 61 y w w w .s el so f t.a Ø Yandakihiyerarşigözönüne alındığında, Ø fırlatılan FileNotFoundExceptio n nesnesi,IOException hattaException nesnesi bekleyencatch bloğunda, Ø yadafırlatılan ArithmeticException nesnesi, RuntimeException hatta Exception nesnesi bekleyencatch bloğunda yakalanabilir. ca de m UygunException www.javaturk.org 62 y ca de m DivisionByZero3.java w w w .s el so f t.a Ø ArithmeticException fırlatan“divide()”metodunun nesnesinin,nasılfarklıcatch bloklarıylayakalanabildiğini gözlemleyin. www.javaturk.org 63 y ca de m YerineGeçebilme- II t.a Ø Yerinegeçebilme(substitutability)özelliğindendolayı,her sıradışıdurumnesnesi,üstsınıfındanbirnesnebekleyen bağlamdakullanılabilir. w .s Amadahaözelolanınıyadaaralarındabiris-ailişkisiolmayanı fırlatamaz. w w Ø el so f Ø Bucümleninikincisonucu: 2. Birmetot,gerçektefırlatılanException nesnesiyerine dahadahagenelolanınıfırlatabilir. www.javaturk.org 64 y ca de m ExceptionExample4.java t.a Ø Aynıkodasahipolan“openAndCloseFile()”metodunun farklışekillerininnasılfarklıtürdensıradışıdurumnesneleri fırlattığınıgözlemleyin. w w w .s el so f Ø Ama“openAndCloseFile()”metodunun,kodundafırlatılan sıradışıdurumnesneleriilebiris-ailişkisinesahipolmayan örneğinArithmeticException fırlatamayacağınıda gözlemleyin. www.javaturk.org 65 y ca de m YerineGeçebilme- III w w Ø Aksitaktirdeerişilemeyenkod(unreachable code)oluşurvebuda birderlemezamanıhatasıdır. catch bloklarımutlakafarklıtürdenException nesneleri almalıdırlar,eğeraynıtry bloğununa aitikicatch bloğuaynınesneyi alırsabirderlemehatasıoluşur. w .s Ø el so f t.a Ø Yerinegeçebilme(substitutability)özelliğindendolayı,her sıradışıdurumnesnesi,üstsınıfındanbirnesnebekleyen bağlamdakullanılabilir. Ø Bucümleninüçüncüsonucu: 3. Birdenfazlacatch bloğununvarlığıhalinde,bubloklar,daha özelException nesnesialanındandahagenelolanına doğrusıralanmalıdır. www.javaturk.org 66 y ca de m t.a so f el w w w .s try { openAndCloseFile(path); } catch(IOException e){ … } catch(FileNotFoundException e){ // unreachable code } try { openAndCloseFile(path); } catch(Exception e){ … } catch(IOException e){ // unreachable code } catch(FileNotFoundException e){ // unreachable code } www.javaturk.org 67 y t.a so f el Ø Benzerbirdurum, birmetodun fırlattığısıradışı nesneleri tanıtırkensöz konusudeğildir. ca de m YerineGeçebilme- III w // Ya da w .s void openAndCloseFile(String path) throws IOException, FileNotFoundException w void openAndCloseFile(String path) throws FileNotFoundException, IOException www.javaturk.org 68 y w w w .s el so f t.a ca de m ExceptionExample5.java www.javaturk.org 69 ca de m y Human.java w w w .s el so f t.a Ø B.Eckels’in “Thinking inJava”kitabından. www.javaturk.org 70 ca de m y SıraDışıDurumYakalandıktanSonra w w w .s el so f t.a Ø Sıradışıdurumyakalandıktansonraneolur? Ø Akış,sıradışıdurumuyakalayancatch bloğundandevameder. Ø Akış,sıradışıdurumasebepolanbağlamageridönmez. Ø Dolayısıylasıradışıdurumuyakaladıktansonraşunlar yapılabilir: Ø Sıradışıdurumasebepolankodu,şartlarıdeğiştirerektekrar çağırmak, Ø Yadasıradışıdurumasebepolankodubirdahaçağırmadan devametmek. Ø Herhalükardasıradışıdurumulog ilekayıtaltınaalmakda birseçenektir. www.javaturk.org 71 y ca de m DivisionByZero4.java Ø ArithmeticException nesnesiyakalandıktansonra w w w .s el so f t.a akışınnasıldevamettiğinigözlemleyin. www.javaturk.org 72 ca de m y catch BloğundaÇokluException- I so f t.a Ø Birdenfazlasıradışıdurumfırlatılmaihtimaliolması durumunda,istenirsebirdenfazlacatch bloğuyazmak yerinetekbircatch bloğuylayetinmekmümkündür. Ø JavaSE7 ilegelenbuözelliksayesindecatch bloğuna“|”ile yakalanacakbirdenfazlaException nesnesinintipi geçilebilir. w .s el try {…} catch(IOException e){…} catch(ArithmeticException e){…} w w try {…} catch(IOException | ArithmeticException e){…} www.javaturk.org 73 y w w w .s el so f t.a ca de m DivisionByZero5.java www.javaturk.org 74 ca de m y catch BloğundaÇokluException- II w .s el so f t.a Ø catch bloğundaçokluException kullanılmasıdurumunda, hertürnesneiçinaynıkodungeçerliolduğunadikkat edilmelidir. Ø Ayrıcacatch bloğunageçilenException nesneleri arasındabiris-ailişkisiolmasıdurumunda,sadecedaha genişolantipkullanılabilir. Ø Budurumzatenbirderlemehatasıdır. w w try {…} catch(IOException | FileNotFoundException e){…} // Compilation error www.javaturk.org 75 y ca de m t.a w w w .s el so f try-catch ile Kaynak Yönetimi www.javaturk.org 76 ca de m y try-catch BloğuveKaynaklar t.a Ø Sıradışıdurumlarıtry-catch ileyönetimindeeğertry bloğundabazıkaynaklaraçılıyorsavetry bloğundasıradışı durumfırlatılırsabukaynaklarkapanmayabilir. w w w .s el so f private static void openFile(String path) { File file = new File(path); try { InputStream in = new FileInputStream(file); System.out.println("File opened!"); doSomethingWithFile(in); in.close(); // Can’t get here to close file } catch (FileNotFoundException e) { … } catch (IOException e) { … } } www.javaturk.org 77 y ca de m Kaynaklıtry Bloğu so f t.a Ø Butürdenaçılankaynaklarınkapanmamariskiniortadan kaldırmakiçinJavaSE7’dekaynaklı try bloğu (try-withresources)yapısıgeldi. Ø Buyapıyla,try ifadesinde,bloktakullanılacakveneşekilde olursaolsunblokçıkışındaotomatikolarakkapatılacak kaynaklartry ifadesindelistelenir. w w w .s el try (ResType1 res1 = initialization1, ResType2 res2 = initialization2,…){ doSomething(); } catch(SomeException e){ … } catch(OtherException e){ … } catch(AnotherException e){ … } www.javaturk.org 78 ca de m y AutoClosable so f t.a Ø Birkaynağın,kaynaklıtry bloğundalistelenebilmesiiçin java.io.AutoClosable arayüzünügerçekleştirmesiya dabuarayüzügerçekleştirenbirsınıftanmirasdevralması gereklidir. el Ø AutoClosable arayüzünde birtanemetotvardır. w .s public void close() w w Ø Bumetot,try bloğundatanımlanankaynakların,try bloğundanneşekildeçıkılırsaçıkılsınkapatılmasıiçin otomatikolarakçağrılır. www.javaturk.org 79 y ca de m ClosableExample.java Ø Önce“run0()”metodunuçalıştırınvekaynaklıtry kullanılmadığıhaliinceleyin. w w w .s el so f t.a Ø Sonra“run1()”metodunuçalıştırınveaynıişinkaynaklıtry ilenasıldahakolayyapılabildiğinigözlemleyin. www.javaturk.org 80 y ca de m KaynaklarıKapatma Ø try ifadesindebirdenfazlakaynaktanımlanırsa, kapatılmalarıtanımsırasınıntersineolur. so f t.a Ø Dolayısıylailktanımlananensonkapanır. w w w .s el Ø Birbirlerinebağımlıyapılardabudurumugözönünealmak gereklidir. www.javaturk.org 81 ca de m y KaynağıOluştururkenProblem w w w .s el so f t.a Ø Eğerkaynakaçılırkenyaninesnesioluşturulurkenproblem olursavebirsıradışıdurumfırlatılırsabudurumdazaten kaynakoluşturulmayacakdemektir. www.javaturk.org 82 y ca de m ClosableExample.java Ø “run2()”metodunuçalıştırın.Buradakaynaklarınhangi sıralayla kapanacağınıgözlemleyin. w w w .s el so f t.a Ø “run3()”metodunuçalıştırın.Buradakaynakların oluşturulurkenbirsıradışıdurumfırlatılmasıhalindene olacağınıgözlemleyin. www.javaturk.org 83 y ca de m t.a w w w .s el so f finally www.javaturk.org 84 ca de m y finally Bloğu- I so f t.a Ø finally, try-catch yapısındakullanılabilenbirdiğerbloktur. Ø Zorunlıdeğildir,olursasadecebirtaneolabilir. Ø Muhakkakensoncatch bloğundansonragelir. Ø try-catch-finally bloklarıarasınabirbaşkakodparçasıgiremez. Ø try bloğunagirenkod, catch bloğunagirsinyadagirmesin, daima finally bloğunagirer. w w w .s el try { doSomething; } catch(SomeException e){ … } catch(OtherException e){ … } catch(AnotherException e){ … } finally{ … } www.javaturk.org 85 ca de m y finally Bloğu- II t.a Ø Dolayısıylafinally bloğu,sıradışıdurumoluşmasınabağlı olmadan,try bloğunagirmektenkaynaklanandurumlariçin kullanılır. w w w .s el so f Ø Akıştry bloğunagirildiktensonraisternormalolarakçıksın isterbirsıradışıdurumunfırlatılmasıylaçıksın,nihayetinde muhakkakfinally bloğunagirer. www.javaturk.org 86 y w w w .s el so f t.a ca de m FinallyExample.java www.javaturk.org 87 y ca de m finally Bloğu– Kaynaklıtry Ø finally bloğununkaynaklarıotomatikolarakkapatan kaynaklıtry bloğundanfarkınedir? so f t.a Ø Kaynaklıtry bloğusadeceAutoClosable olanyapılariçin geçerlidir. w w w .s el Ø Bunundışındakihertürlükaynağınyönetimiiçinfinally bloğukullanılmalıdır. www.javaturk.org 88 y ca de m Nedenfinally Bloğu? w w w .s el so f t.a Ø finally bloğukaynakyönetimiaçısındanönemlidir. Ø Öncelikle AutoClosable olankaynaklariçinkaynaklıtry kullanılmalıdır. Ø try içindeaçılanveAutoClosable olmayanvehertürlü kaynağıkapatmanınyerifinally bloğudur Ø Dolayısıylafinally bloğu,try bloğundayapılanhertürlüişiçin birtemizlikyeriolarakdüşünülmelidir. Ø Buşekildesıradışıdurumfırlatılmasabileözelliklereturn, break vecontinue gibikontrolyapılarıyüzündençalışmayan vetemizlikyapankodparçalarınınfinally bloğunda çalışmasısağlanır. www.javaturk.org 89 y w w w .s el so f t.a ca de m CleanUpWithFinally.java www.javaturk.org 90 ca de m y Dikkat! Ø finally bloğundakaynaklarıkapatırkensıradışıdurumların tekraroluşabileceğidedüşünülmelidir. w w w .s el so f t.a Ø Dolayısıylafinally bloğundadatry-catch-finally kullanılabilir. www.javaturk.org 91 y ca de m t.a w w w .s el so f Sıra Dışı Durumu Tekrar Fırlatmak www.javaturk.org 92 y ca de m TekrarFırlatmak- I Ø Bazensıradışıdurumyakalanıramatekrarfırlatılır. Ø Budurumlardayakalamaamacıçoğunluklaloglamaktır. w .s el so f t.a try { // access the database } catch (SQLException ex) { ... logger.log(logLevel, message, ex); throw ex; } w w Ø Amasıradışıdurumunnasılyönetileceğibilinmediğinden, gerçektenonuyönetecekkodagitmesiiçinsıradışıdurum tekrarfırlatılır. www.javaturk.org 93 y ca de m TekrarFırlatmak- II so f t.a Ø Bazendesıradışıdurumyakalanıp,birbaşkasıradışı durumuniçinekoyuptekrarfırlatılır. Ø Budurumasıradışıdurumlarızincirleme(chaining exceptions)denir. Ø Buamaçla void initCause(Throwable t) metodu kullanılabilir. w w w .s el try { // access the database } catch (SQLException ex) { logger.log(logLevel, message, ex); Throwable e = new NoSuchProductException(“No such product!”); e.initCause(ex); // Optional! throw e; } www.javaturk.org 94 y ca de m TekrarFırlatmak- III w .s el so f t.a Ø Bazenbirsıradışıdurumyakalanıptamamenfarklıbirsıra dışıdurumunfırlatıldığıdaolur. Ø Buamaçla void initCause(Throwable t) metodu çağrılmazyadakurucumetodayakalanansıradışıdurum geçilmez. Ø Buyaklaşım,çokteknikolansıradışıdurumların yakalanmasındakullanılır. Ø Tekniksıradışıdurumbuyolladahaişmerkezlisıradışı durumadöndürülmüşolur. w w try { // access the database } catch (SQLException ex) { logger.log(logLevel, message, ex); Throwable e = new NoSuchProductException(“No such product!”); throw e; } www.javaturk.org 95 y ca de m TekrarFırlatmak- IV Ø Bununengüzelörneği,java.sql.SQLException gibibazı sıradışıdurumnesnelerinin,tekbirnesneileolabilecekpekçok sıradışıdurumutemsiletmesidir. so f t.a Ø Böyledurumlardabusıradışıdurumyakalanırveiçindeki bilgilerdenyolaçıkarakfarklıişsıradışıdurumlarıfırlatılabilir. getErrorCode() el int w .s SQLException getNextException() getSQLState() Iterator<Throwable> iterator() w w String www.javaturk.org 96 y ca de m t.a w w w .s el so f Checked-Unchecked Exceptions www.javaturk.org 97 y ca de m Checked veUnchecked w w w .s el so f t.a Ø Java’dasıradışıdurumlarikiye ayrılır:checked veunchecked. Ø Exception sınıfınınaltsınıfı olupdaRuntimeException olmayansınıflar,checked exception olarakadlandırılırlar. Ø RuntimeException vealt sınıflarıiseunchecked exceptiondur. Ø Error deunchecked exceptiondur. www.javaturk.org 98 y ca de m Checked Exceptions so f t.a Ø Checked exceptionlar yayakalanmalıyadametot arayüzünde throws ilefırlatıldığıbelirtilmelidir. Ø Dahaöncegeçen“Java’nınsıradışıdurumlarıyok görülemez,muhakkakyakalanmalı...”cümlesisadece checked exceptionlar içingeçerlidir. w w w .s el Ø Eğerbirkodparçasıchecked exception fırlatıyorsabu durumdaikiseçenekvardır: Ø Yatry-catch ileyakalamak, Ø Yadayakalamayıparayüzde throws ilefırlatıldığınıbelirtmek. Ø Budurumderlemezamanındakontroledilirvegerekirse derlemehatasıverilir. www.javaturk.org 99 y ca de m Unchecked Exceptions - I so f t.a Ø Unchecked exceptionlar yakalanmakyadametot arayüzünde throws ilefırlatıldığıbelirtilmekzorunda değildir. Ø Çünküunchecked exceptionlar programcıhatasıdır, düzeltilmelidirler. w w w .s el Ø Tümunchecked exceptionlar lava.lang.RuntimeException sınıfınınyadaalt sınıflarınınnesneleridir. Ø RuntimeException sınıfının(yadaaltsınıflarının) nesnelerininfırlatılmasıderlemezamanındakontrol edilmezveyakalanmadığıyadabelirtilmediğindedehata oluşmaz. www.javaturk.org 100 y ca de m Unchecked Exceptions - II Ø RuntimeException sınıfının(yadaaltsınıflarının) t.a nesnelerininfırlatılmasıderlemezamanındakontrol edilmezveyakalanmadığıyadabelirtilmediğindedehata oluşmaz. el so f Ø Buyüzdenbutürsıradışıdurumlarınatasıolansınıfa RuntimeException adıverilmiştir. w w w .s Ø Aslenchecked olsunyadaolmasıntümsıradışıdurumlar zatençalışmazamanındaoluşur. www.javaturk.org 101 y ca de m Checked - Unchecked so f t.a Ø Checked exceptionlar umulanvedüzeltilebilecekdurumları ifadeeder,örneğinFileNotFoundException. Ø Buyüzdençalışmazamanındayakalanıpdüzeltilmelidirler. Ø Amaunchecked exceptionlar programcıhatasıdır,çalışma zamanındaoluşmasıbeklenmemelidir. Ø ÖrneğinNullPointerException w w w .s el Ø Eğerbirunchecked exception çalışmazamanında oluşuyorsa,koddadüzeltilmelidirler. Ø Nihayetindebiryazılımsistemininkodu,çalışmazamanında hiçbirunchecked exception fırlatmayacakhale getirilmelidir. www.javaturk.org 102 ca de m y YaygınUnchecked Exceptionlar Ø Yaygınunchecked exceptionlar: Ø java.lang.NullPointerException:Muhtemelenenyaygın w w w .s el so f t.a unchecked exceptiondur.null referansıifadeeder. Ø java.lang.ArithmeticException:Matematiksel hesaplamalardaortayaçıkabilecekdurumlardır.“0”abölmek gibi. Ø java.lang.ClassCastException:Nesnelerinyanlışaltsınıfa dönüştürülmelerinde(down cast)fırlatılır. Ø java.lang.IndexOutOfBoundsException:Stringyadadizi (array)gibiyapılardayanlışerişimdurumlarınıifadeeder. Ø java.lang.NumberFormatException:GirilenString nesnesininsayıformatınadönüştürülmesisırasındaoluşan sıradışıdurumlarıifadeeder. IllegalArgumentException’un altsınıfıdır. www.javaturk.org 103 w w w .s el so f t.a ca de m y RuntimeExceptionExample.java www.javaturk.org 104 y ca de m t.a w w w .s el so f Sıra Dışı Durum Sınıfı Oluşturmak www.javaturk.org 105 ca de m y SıraDışıDurumSınıfıOluşturmak- I w w w .s el so f t.a Ø Kodunuzdakisıradışıdurumlarıyönetmekiçinönce Java’nınvekullandığınızdiğerbileşenlerinyada kütüphanelerinsıradışıdurumlarınıkullanın. Ø ÖrneğinHibernate’in Session sınıfındakiload() metodu veritabanındagirilenbiridye karşılıknesnebulunamadığında org.hibernate.ObjectNotFoundException sıra dışıdurumufırlatılırvemesajolarakda“Norow with the given identifier exists”yazar. Ø Budurumdabusıradışıdurumyakalanıpişlenebileceğigibi, yakalanannesnedenalınacakbilgilerle “BoyleBirUrunBulunamadı” yada“NoSuchProduct” gibisıra dışıdurumlarfırlatılabilir. www.javaturk.org 106 ca de m y SıraDışıDurumSınıfıOluşturmak- II so f t.a Ø Bunlaryeterlideğilsekendisıradışıdurumsınıflarınızı oluşturun. Ø SıradışıdurumsınıfıoluşturmakiçinException sınıfından mirasdevralınır. argümangeçilir. el Ø TipikolarakkurucusunaString w w w .s Ø İhtiyacagöresınıfüzerindefarklıdeğişkenlervegerekli set/get metotlarıdaoluşturulabilir. Ø Çünküsıradışıdurumnesneleribilgitaşıyabilir. www.javaturk.org 107 w w w .s el so f t.a ca de m y ShapeTest.java www.javaturk.org 108 y ca de m t.a w w w .s el so f Exception ve Overriding www.javaturk.org 109 ca de m y Ezilen Metotların Sıradışı Durumları w w w .s el so f t.a Ø Üst tipteki bir metodun fırlatığı sıra dışı durumlar ile bu metodun devralınıp,overrideedildiği durumdaki fırlattığı sıra dışı durumlar arasındaki ilişki nedir? Ø Üst tipteki metot overrideedildiğinde,overrideeden metot,ebeveyndeki metodun fırlattığı sıra dışı durumlardan fazlasını fırlatamaz ama daha azını fırlatabilir. Ø Çünkü,ebeveynin istemcisi ençok ebeveyndeki metodun fırlattığı sıra dışı durumu beklemektedir,daha çoğunu beklememektedir. Ø Alttipte,ebeveyndeki metodun fırlattığından daha çoğunu fırlatmak,yerine geçme özelliğini bozar. www.javaturk.org 110 ca de m y Ezilen Metotların Sıradışı Durumları w w w .s el so f t.a Ø Dolayısıyla overrideeden metot şu üç durumdan birini seçebilir: Ø Aynı sıra dışı durumu fırlatmak, Ø Ebeveynde fırlatılan sıra dışı durumun bir alttipini fırlatmak, Ø Hiç sıra dışı durumfırlatmamak. www.javaturk.org 111 ca de m y HR.java &HRForManagerX.java w w w .s el so f t.a Ø overriding package www.javaturk.org 112 y ca de m t.a w w w .s el so f Assertion www.javaturk.org 113 y ca de m DefensiveProgramming t.a Ø http://c2.com/cgi/wiki?DefensiveProgramming de: “Defensiveprogrammingdefendsagainstthecurrently impossible”. w w w .s el so f Ø Savunmacı programlama,olabilecek durumları önceden sezerek onlara karşı önlem almayı öngören bir programlama yaklaşımıdır. www.javaturk.org 114 ca de m y Assertion Ø Assertionkelime olarak öne sürme,iddia etme gibi anlamlara gelir. ise savunmacı programlamanın (defensive programming)bir tekniğidir. so f t.a Ø Programlamada el Ø Assertion,bir boolean değer üreten ve herzamantrue Aksi taktirde hata (error) oluşur. w w Ø w .s beklenen durumdur. olması www.javaturk.org 115 y ca de m assertAnahtar Kelimesi - I Ø assert anahtar kelimesi Java’ya 1.5sürümüyle birlikte katılmıştır. Ø assert kullanımının iki şekli vardır: assert expression; so f için kullanılır. t.a Ø İlkinde assert kendisini takip eden ifadenin doğruluğunu testetmek Ø İfade doğruysa çalışma devam eder,yanlışsa w .s el java.lang.AssertionError fırlatılır. Ø İkinci şekilde ise assert’ten sonra iki ifade vardır: assert expression1 : expression2; w Çalışma ilkşekildeki gibidir.Tek fark ilkifadenin yanlış olması halinde bir değer üreten ikinci ifadenin sonucunun AssertionError’in uygun bir kurucusuna geçilmesidir. w Ø www.javaturk.org 116 y ca de m assertAnahtar Kelimesi - II t.a Ø assert kullanımı,maliyetli oluşundan dolayı çalışma zamanı için açılıp kapatılabilen bir özelliktir. el so f Ø Varsayılan durumda assert kullanımı kapalıdır. Ø Açmak için JVM’e –enableassertions ya da–ea seçeneklerini geçmek gereklidir,aksi taktirde assert ifadeleri çalışmaz. w w w .s Ø Buyüzden assert ifadeleri kod geliştirme aşamasında, kodun doğru çalıştığından emin olmak için kullanılır ve canlı (live)ortamda kapatılır. www.javaturk.org 117 y w w w .s el so f t.a ca de m AssertionExample.java www.javaturk.org 118 ca de m y TestAmaçlı assertKullanımı - I t.a Ø assert kullanımının açılır-kapatılır bir özellik olması,bu yapının programcı tarafından testamacıyla serbestçe kullanılabilmesine imkan tanır. w w w .s el so f Ø Buyüzden assert genel olarak bir verinin geçerliliğini (invariant)testetmek için kullanılır. Ø Buveri bir metottaki yerel değişken olabileceği gibi bir nesnenin durumu daolabilir. Ø Ön ve sonşartları (pre&postconditions)testetmek için de kullanılır. www.javaturk.org 119 y ca de m w w w .s el so f t.a SqrtCalculator.java www.javaturk.org 120 w w w .s el so f t.a ca de m y PrePostConditionsExample.java www.javaturk.org 121 w w w .s el so f t.a ca de m y SwitchDemoWithAssertion.java www.javaturk.org 122 ca de m y assertve Sıra Dışı Durumlar w .s el so f t.a Ø assert kullanımının açılır-kapatılırdır ama sıra dışı durum yönetimi kalıcıdır. Ø Dolayısıyla assert canlı ortamda olması muhtemel durumları yakalamak için kullanılmaz. Ø Zaten sıra dışı durumoluşunca yakalanır ve çalışma devam eder. Ø Ama AssertionError oluşunca JVMçalışmasını durdurur. w w Ø assert kodun doğru çalıştığından emin olmak amacıyla,bir geliştirme zamanı yapısı olarak,bir durumun olmadığını test etmek için kullanılır ve canlı ortamda kapatılır. www.javaturk.org 123 y ca de m t.a w w w .s el so f Sıra Dışı Durum İçin Tavsiyeler www.javaturk.org 124 ca de m y Tavsiyeler - I Ø Sıra dışı durumları iş modelinizin parçası haline getirin. Ø Buamaçla kendi Exception nesnelerinizi oluşturun. Ø Exception nesnelerini kullanırken olabildiğince özel olun, t.a genel olmayın. so f Ø Örneğin Exception nesnesini hiç bir zamanfırlatmayın, daimadahaözelaltnesnelerinifırlatın. w w w .s el Ø Fırlattığınız sıra dışı durumnesnelerine gerekli detayda veriyi koyun. Ø Fırlatılan sıra dışı durumları API’de @throws ile belirtin ve açıklayın. www.javaturk.org 125 ca de m y Tavsiyeler - II w w w .s el so f t.a Ø Ya kaynaklı try kullanın ya dafinally bloğunda kaynaklarınızı kapatın. Ø Sıra dışı durumları loglayın. Ø Buamaçlabirloglamayapısıkurgulayın. www.javaturk.org 126 ca de m y Özet Ø Bubölümdesıradışıdurumyönetimielealındı. t.a Ø Throwable, Error veException sınıflarıincelendi. el so f Ø try-catch-finally yapısıelealındı. w w .s Ø assert anahtarkelimesivesavunmacıprogramlamaele alındı. w Ø Sıradışıdurumyönetimiyleilgilitavsiyelerelealındı. www.selsoft.academy 127 y ca de m t.a w w w .s el so f Ödevler www.selsoft.academy 128 ca de m y Ödevler I so f t.a Ø Employee hiyerarşisininbulunduğuörnekte,maaşı7.000TL veüzerineolanlariçinSalaryPaidOnBankException isimlibirsıradışıdurumnesnesioluşturupörneğitekrar düzenleyin. w w w .s el Ø BazıJavaframeworkleri checked exception kullanmayıp, tümexceptionları RuntimeException yaniunchecked exception olaraktanımlamaktadır.Butercihitartışın. www.selsoft.academy 129