JAVA_2

advertisement
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
Download