16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Exception, Try ... Catch Mekanizması Java (Ve Farklı Programlama Dillerinde)’da bir uygulama geliştirirken, bazı noktalarda, dış kaynaklara erişim sağlayıp, ordan değerler almanız gerekebilir. Sizin yazmış olduğunuz kod bloğu %100 doğru çalışsa bile, (%100 : syntax veya mantık hatası olmayan), yinede dış kaynaklara erişemeyebilir, yada değeri istediğiniz gibi alamayabilirsiniz. Örnek olarak, klavyeden (kullanıcıdan) bir sayı alan, ve bu sayıyı 2 ile çarpıp ekrana yazdıran bir uygulama yı ele alalım. Bu kodlamada herhangi bir syntax yada mantık hatası yok. Uygulama çalıştığında kullanıcıdan bir değer girilmesi bekleniyor. Girilen değer, int (tam sayı) şeklinde alınıp bir değişkene atılıyor. Değişkenin değeri 2 ile çarpılıp ekrana yazılıyor. Yukarıda bahsetmiş olduğum dış kaynak burada kullanıcının klavyeden girmiş olduğu değerdir. Kullanıcı bu noktada 44 gibi sayısal bir değer girdiği zaman bir sıkıntı yok. Peki ya selam yazıp, enter a basarsa ? Bu girilen değer, yine klavyeden alınır. Ama int’e çevrilemeyeceği için uygulama hata verir. Emir Civaş – [email protected] Sayfa 1 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Java’da bu hata durumlarına en genel tabiriyle “Exception” (İstisna) Denir. Tabiri İse, Exception Fırlatmak (throw)’tır. Özetlemek gerekirse, Java’da bir işlem yapiyorsunuz, ve bu işlemin başarı ile sonuçlanacağı belli değil. Bu durumlarda uygulamanız Exception fırlatabilir. Bu Durumlara Örnek : - Klavyeden Sayı Değeri Girilmesini Beklerken, Selam Yazılması Bilgisayarınızda Olmayan Bir Dosyayı Okumaya Çalışmanız ADSL Faturasını Ödememişsiniz, TTNET Interneti Kesmiş, Ama Web Sitesine Bağlanmaya Çalışıyorsunuz Olmayan Bir Sunucuya Bağlanmaya Çalışmanız ( Orn : http://www.asdfgh.jp ) Web Sitesine Bağlanmak İçin Geçersiz URL ( Orn : htp:/www.google .com ) Bir Sunucuya Bağlanırken, Hatalı Port Değeri Vermeniz Bir Sunucu Uygulaması Çalıştırırken, Başka Bir Uygulama Tarafından Kullanılan Portu Açmak Vb.. Bu Bahsettiğim İşlemlerin Hepsi Belirli Adımlardan Geçer. Ve Java Bu Adımlarda Oluşabilecek Hataları Önceden Kestiremez. Dolayısıyla, Oluşabilecek Hatalar İçin, Bir Önlem Mekanizmasına İhtiyacınız Olucak. İşte bu mekanizmanın adı try ... catch ‘tir. Kullanımı Basit’tir. Temelde İki Bölümden Oluşur. İlk Bölüm try { ... } 2. Bölüm ise catch ( ) { ... }. Try Bölümüne, Hata Çıkartması Olası Kodları Yazarsınız. Catch Bölümüne, Bir Hata Oluştuğunda Çalışması Gereken Kodları Yazarsınız. Eğer Try Bölümüne Yazdığınız Kodlar Çalışırken Bir Hata Çıkmazsa, Catch Bölümüne Girilmez Try Bölümünde 4 Satır Kodunuz Var. 2. Satırda Hata Çıktı Diyelim, 3. & 4. Satırlar İşlenmez. Örneğin; Yukarıda Bahsedilen Sayı Uygulaması.. Atıyorum Kullanıcı Sayı Yerine Sayıya Çevrilemeyen Bir Giriş Yaptıysa, Kullanıcıyı Uyaralım. Emir Civaş – [email protected] Sayfa 2 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Uygulamada Hata Oluşmazsa catc bloğu çalışmaz. Fakat Bir Hata Oluşursa, Hata Oluşan Kod Çalıştıktan Sonra, catch’e yönlenir, try içindeki sonraki kodlar çalışmaz. Exception Genel Bir Kavramdır. Bunun Kategorilere Ayrılırlar. Bu Durumda Istenirse, Aynı Kod Bloğunda Farklı Hata Durumları İçin, Farklı İşlemler Yapılabilir. Bu Exceptionların Bazıları : Exception Açıklama ArithmeticException Aritmetik Hata Durumu. Örneğin 0’a Bölme ArrayIndexOutOfBoundsException Bir Array’in Sınırlarının Dışına Taşma Durumu ClassCastException Invalid cast. NegativeArraySizeException Array’in Eleman Sayısı Negatif. NullPointerException Bir Objenin Oluşturulmadan, Kullanılması. NumberFormatException Bir Sayıyı Formatlama Hatası SecurityException Güvenlik Hatası InputMismatchException Alınan Verinin İstenilen Türe Çevrilememe Hatası UnknownHostException Bilinmeyen Internet Adresi / Sunucu Hatası Catch bölümünde (Exception e ( e Bir İsim, İstediğinizi Yazabilirsiniz) ) Yazdığımızda Yukardaki Exceptionların (Ve Daha Çoğunun, Hepsini Yakalar) Ama atıyorum sadece NullPointerException ve UnknownHostException Yakalamak İstiyorsanız try { ... } catch (NullPointerException npe) { } catch (UnknownHostException uhe() { } şeklinde farkli catch blokları oluşturabilirsiniz. Emir Civaş – [email protected] Sayfa 3 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Veya Başka Bir Çözüm, Genel Olarak Bütün Exception’ları Tek Bir Catch Bloğunda Yakalayıp, Exception If’lerle Ne Olduğunu Algılayıp Ona Göre İşlem Yapabilirsiniz. Klavye’den Sayı Alma Dışındaki Durumlarda, Zaten IDE Sizi, try .. catch Kullanmanız Durumunda Uyaracaktır. Java.lang.Math Sınıfı Uygulama Geliştirirken, Çoğunlukla Bir Çok Matematik İşlemini ve Kontrolünü Gerçekleştirmemiz Gerekebilir. Bunu İstersek Kendimizde Yapabiliriz. Yada Math Sınıfının Hazır Değişken Ve Methodlarını Kullanarakta Yapabiliriz. Math Sınıfı, Matematik Sabitlerinden, Sayı Kıyaslama Methodlarına, Trigonometrik Methodlardan, Logaritmik Methodlara, Bir Çok Özellik Sunmaktadır. Bu Sınıfta Bulunan Tüm Methodlara & Açıklamalarına (Bu Açıklama Türüne JavaDoc Denir) http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html Adresinden Ulaşabilirsiniz Bu Sınıfta random() diye bir method var. random() methodu, her çağırdımızda bize 0 ile 0.999.. Arası Değer Döndürür. Biz Bu Yapıyı Kullanarak İstediğimiz Aralıkta Rastgele Değerler Elde Ederiz. Örneğin : Bozuk Para Atma (Yazi : 0 – Tura : 1) = (int) (Math.random() * 2); Tavla Zarı ( 1,2,3,4,5,6) = (int) (1 + Math.random() * 6); 0 – 100 Arası Sayı = (int) (Math.random() * 101); 20 – 40 Arası Sayı = (int) ( 20 + Math.random() * 21); -30, +30 Arası Sayı = (int) (- 30 + Math.random() * 61); Emir Civaş – [email protected] Sayfa 4 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 İç İçe Döngüler – Nested Loops Döngüler, Bizim Bir İşi Belirli Sayıda Tekrar Etmemizi Sağlıyor. Örneğin 1 – den 10’a Kadar Sayıların Ekrana Basılması : for (int i = 1; i<=10; i++) System.out.println(i); Bu Örnekte Döngünün Her Bir Adımında (Yapılan İş) Ekrana Bir Sayı Basılması. Peki İlkokulda Öğretilen, Çarpım Tablosunu Döngü İle Nasıl Yapabiliriz ? Bunun için, nested loops, yani iç içe döngü kullanmamız gerekiyor. İç içe döngü dediğimiz şey, bir döngünün her bir adımının, aslında başka bir döngü olmasıdır. Bu Örnekte dış döngü, 4 kere döner. İçteki döngüde, dış döngünün her bir dönüşünde 3 kez döner. Yani iç döngünün sınırları içinde yapılan işlem 4x3 = 12 kez tekrarlanır. Çarpım Tablosu 1’den 10’a Kadar Sayıların, 1’den 10’a kadar Sayılarla Çarpılmasından Oluşur. Bunu Yapabilmek İçin Nested Loops Kullanırız. Emir Civaş – [email protected] Sayfa 5 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 İç İçe Döngüler, İstenildiği Kadarıyla Arttırılabilinir. Dış Döngü = 1 Kere Döner İç Döngü #1 = 2 Kere Döner İç Döngü #2 = 3 Kere Döner İç Döngü #3 = 2 Kere Döner Ekrana, Toplam = 1 x 2 x 3 x 2 = 12 Kere Deneme Yazılır. ÖNEMLİ : İç Döngüler, Doğru Kullanılmadığı Takdirde, Performans Kayıplarına Yol Açar. Heleki, iç içe döngülerin tekrar sayısı, üst döngülerin indexlerine bağlıysa, doğru değerler verilmediğinde sonsuz tekrar durumlarına girerler. Örn : Emir Civaş – [email protected] Sayfa 6 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Array - Dizi Java’da biz bir değer tutmak, ve o değer üzerinde işlemler yapmak istersek değişkenler tanımlayıp kullanıyoruz. Fakat ihtiyacımıza göre, tek tek değişken oluşturup kullanıp, yapacağımız işi çok uzatabilir. Hatta yapmak istediğimiz şeyin çözümünü bize sunmayabilir. Bu tür durumlarda, array (dizi) denen yapıları kullanmamız doğru olur. Misal siz 3 tane sayıyı, int a = 2, b=20, c = 200; şeklinde tanımlayip, bunlari if ler sayesinde, en büyük yada en küçüğünü bulabilirsiniz. Ama tutmak ve kıyaslama yapmak istediğimiz sayı 3 değilde 345 ise ? Veya, kaç sayı tutulacağı kod ta değil de parametrik (on the fly, uygulama çalışırken) olarak belirleniyorsa? İşte bu durumlarda Array kullanmalıyız. Array, aynı tipte değişkenlerin, grup olarak tutulması, ve istenilen değişkene index adı verilen bir sayıyla erişilmesine olanak sağlayan bir yapıdır. int a[] = new int[5]; Şeklinde tanımlanır. Bu Tanım : “Benim a adında bir arrayim var. Bu array içinde int tipinde değişkenler tutacak. Ve boyutu 5” demek. Bu arraydeki elemanlara a[0], a[1], a[2], a[3], a[4] diye erişebilirsiniz. ÖNEMLİ : Bir arrayin boyutunu öğrenmek istersek, length değişkenini kullanabiliriz. System.out.println(“Array Boyutu : “+ a.length); // Array Boyutu : 5 ÖNEMLİ : Arrayler Sınırları Olan Yapılardır. Arrayler Oluşturulurken Boyut Tanımlanır Ve Değiştirilemez. ÖNEMLİ : Arraylerin sınırları içinde dolaşılabilir. 5 elemanlı bir arrayin ilk eleman indexi 0, son eleman indexi 4 (yani n -1) ‘dir. 5 Elemanlı Bir Arrayin Girip a[5] değerine Erişmek istediğinizde Exception fırlatılır. Emir Civaş – [email protected] Sayfa 7 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Array’lerin index ile ilerlemesi, bir çok işin döngüler yardımıyla çok kolay şekilde yapılmasını sağlar. Emir Civaş – [email protected] Sayfa 8 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Başka Bir Senaryo İse, Elinizdeki Bir Grup Sayının Küçükten Büyüğe, Yada Büyükten Küçüğe Sıralanmasıdır. Sıralama (Sorting) Önemli Bir Algoritma Konusudur. Aynı İşi Farklı Biçimde Yapan Sorting Algoritmaları Vardır. Ve Bunların Performans Farklılıkları Vardır. Aşağıdaki Adreslerden Bu Algoritmalar Hakkında Bilgi Edinebilirsiniz : https://en.wikipedia.org/wiki/Sorting_algorithm http://www.sorting-algorithms.com/ Sıralama Elinizdeki Sayı Grubundaki Değerlerin İncelenip, Amacınıza Göre Yerlerinin Değiştirilmesidir. Burada Önemli Bir Konu Var. Programlamada, 2 Değişkenin Değerini Birbiriyle Değiştireceksiniz, Size 3 Değişken Gerektiği! Misal int a = 10, b = 8 olsun. Ben a’yı 8, b yi 10 yapmak istiyorum. a = b; b = a; Yaparsanız hem a, hem b 8 olur b = a; a = b; Yaparsanız hem a, hem b 10 olur. Bunun çözümü 3. Bir değişken tanımlamaktır. int temp = a; a = b; b = temp; Emir Civaş – [email protected] Sayfa 9 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Emir Civaş – [email protected] Sayfa 10 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Double Array – 2 Boyutlu Dizi Tek Boyutlu Diziler, 1 Index’e sahip Olup, Bir Değişken Grubu İçerisinde İlerlememizi Sağlar. Örneğin : Bizim Java Sınıfındaki Öğrencilerin Yaşları. { 24, 26, 22, 30, 27 ... } Peki, Dönem Sonuna Kadar 2 Vize + 1 Final, Toplam 3 Sınav Olduğumuzu Düşünün. Ve Şöyle Bir Yapıya İhtiyacımız Var. Bizim Sınıftaki Öğrencilerin Sınav Notları. Burada İhtiyacımız Olan 1 Array (Sınıftaki Öğrenciler) Ve 1 Array (Her Öğrencinin Sınav Notları). Veya Bir Tablo Düşünün, Satırlar ve Sütünlardan Oluşan (row, col) Ben Bu Tablonun 4. Satırının 2. Sütününa, yada 1. Satırının 1. Sütününa Gidip Değer Okumak İstiyorum. Bu tip durumlarda kullanılan yapı double array’dir. Double Array, array in her bir elemanının başka bir array olmasıdır.Tanımlaması normal Array’lere benzer. İki index kullanılır. // Tablo = 4 Satır, 2 Kolon int ar[][] = new int[4][2]; // Veya = { { 10, 20}, { 22, 33 }, { 44, 50}, {77,88 } }; [0][0] [1][0] [2][0] [3][0] [0][1] [1][1] [2][1] [3][1] // ar.length = 4 verir // ar[ ? ] .length = 2 verir ? : istediğiniz index Tek boyutlu Arrayler, 1 Döngü ile dolaşılırken, 2 boyutlu arrayler içiçe 2 döngü ile dolaşılır. Emir Civaş – [email protected] Sayfa 11 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Method – Fonksiyon Programlama Dillerinde Bir İşi Tekrar Tekrar Yapmak, Yada Bir İşi Farklı Parametrelerle Yapıp (İşlem Değişmeden) Sonuca Ulaşmak İçin İstediğiniz Yere, Kodu Tekrar Tekrar Yazabilirsiniz. Veya Yapılacak İşi Bir Method Haline Getirip, İstediğiniz Zaman Çağırabilirsiniz. Bir Methodun Tanımlanmasında (Method Signature) 3 Ana Bölüm Vardır - #1 Methodun Dönüş Türü #2 Methodun Adı #3 Method Parametreleri Methodun Dönüş Türü, Sizin Methodunuz Bir İşlem Yapıyorsa, Ve Çağrıldığı Yere Bir Değer Döndürüyorsa, Döndürdüğü Değerin tipi dir. Eğer herhangi Bir değer Döndürmüyorsa. void tir. Methodun Adı, Sizin methodunuza verdiğiniz isimdir. Bu methodu başka biryerden çağirirken, bu isimle çağrırsınız. Method Parametreleri, Sizin Methodunuz Bir işlem yaparken, işlemde kullanılacak, dışardan alınan değerleri tanımlar. SCOPE MANTIĞI Methodlar Class Düzeyinde Yazılır (Class Parantezlerinin İçine, Diğer Methodların Dışına) Bir Method’ta Tanımlanan Değişkenler, Yada Parametreler, Sadece O Method İçinde Geçerlidir. A Methodunun İçinde Oluşturduğunuz Bir Değişkeni, Başka Bir Methodun İçinde Kullanamazsınız. Emir Civaş – [email protected] Sayfa 12 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Emir Civaş – [email protected] Sayfa 13 16.06.2013 – Wissen Akademie Java / Android Ders Notları #2 Recursive Method – Kendi Kendini Çağıran Methodların void (hiç bir değer döndürmeyen, kendi içinde bir iş yapıp sonlanan) veya herhangi bir değer dönen versionlarını gördük. Bunların dışında, bir işi yapabilmek için kendi kendini tekrar çağıran methodlada vardır, bunlara recursive method denir. Misal, bir sayının faktoryelini bulmak : 5! = 5 x 4 x 3 x 2 x 1; 5! = | 5 x 4 = 20 | 20 x 3 = 60 | 60 x 2 = 120 | 120 x 1 = 120 Faktoryel’i Bulurken Yapılan İşlem, 1’e Kadar, Bir Sayının Kendisinin, Sayının 1 Eksiği İle Çarpılması İşlemidir. Yani Önce 5 ile 4 çarpılır. Çıkan sonuç 3 ile çarpılır, sonraki çıkan sonuç 2 ile çarpılır, sonraki sonuç ise 1 ile çarpılır. 1! = 1 olduğu için, dahada devam edilmez. ÖNEMLİ : Recursive Methodlar Bir yere Kadar Sürekli Kendilerini Çağırabilirler, Ama Bir Koşul Altında (Örneğin 1! = 1 ‘e Eşit Olduğu için, n 1 ise 1 döndürülmesi Gibi ) Sabit Bir Değer Dönmezse, Sabaha Kadar Çalışırlar Recursive Method İçin Verilebilecek Başka Bir Örnekte Fibonacci Sayı Dizisidir. Fibonacci Sayıları, İlk 2 Sayısı 1 Olarak Kabul Edilen, Kendinden Önceki 2 Sayının Toplamına Eşit Olan Sayılardır. F(n) Değer 0 1 1 1 Emir Civaş – [email protected] 2 2 3 3 4 5 5 8 6 13 7 21 ... ... Sayfa 14