Java Java Programlama Dili • Nesneye yönelik (object-oriented) programlama dili • Üst seviye, genel amaçlı ve açık kodlu • Tüm değişkenler sabit bir veri tipine sahip (statically typed) • Veri tipleri: • Temel veri tipleri (int, double vs.) • Sınıflar • İşletilen bir dil (interpreted). • Derleme birimleri: • Kaynak kodlar: .java dosyası • Derlenen kod (bytecode): .class dosyası Java Sanal Makinesi (JVM) (1) Java Sanal Makinesi (JVM) (2) Java Byte Kodlar • Java dili komut seti, her biri 1-byte olan 256 adet komuttan oluşmaktadır. • Bunlardan 51 tanesi ileriki kullanımlar için ayrılmıştır. • Komutlar aşağıdaki temel kategorilere ayrılabilir: • • • • • • • Load and store (e.g. aload_0, istore) Arithmetic and logic (e.g. ladd, fcmpl) Type conversion (e.g. i2b, d2i) Object creation and manipulation (new, putfield) Operand stack management (e.g. swap, dup2) Control transfer (e.g. ifeq, goto) Method invocation and return (e.g. invokespecial, areturn) Ön/Son Ek ve İşlemci Tipi Ön/Son Ek İşlemci Tipi i int l long s short b byte c char f float d double z boolean a nesne referansı aload veya iload Java Byte Kod Örnekleri Komut Açıklama aload_0 0. yerel değişkendeki nesne referansını yığına at aload_1 1. yerel değişkendeki nesne referansını yığına at iload_0 0. yerel değişkendeki tam sayıyı yığına at istore_1 Yığının tepesindeki değeri birinci yerel değişkene at iadd Yığının tepesindeki iki tamsayı değeri al, topla ve sonucu yığına at dmul Yığının tepesindeki iki double değeri al, topla ve sonucu yığına at Tüm byte kodlar: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings Java Çalıştırma Kiti (JRE) • .class dosyaları files Java byte kodlarını (bytecode) içerir • Donanım bağımsız komut seti • Java byte kodları Java Sanal Makinesi - Java Virtual Machine (JVM) – tarafından yorumlanır. • Byte kodları makine koduna çevirir • Java Çalıştırma Kiti - Java Runtime Environment (JRE) • JVM ve temel Java özelliklerini içerir (örn: java komutu) • Donanım ve işletim sistemi detaylarını soyutlar • Java programları için ortak API’leri gerçekleştirir java komutu ile Java programı çalıştırma • HelloWorld.class isimli bir dosyada derlenmiş Java programınız olsun. • Bu programı çalıştırmak için yandaki komut çalıştırılmalıdır: java HelloWorld • java komutu JRE içerisinde yer almaktadır. • Web sitelerindeki Applet’ler web tarayıcısında çalışan Java programcıklarıdır. • Web tarayıcısı, arka planda, java komutunu kullanarak bu appletleri çalıştırır. (JRE kurulu olmalıdır) Java Geliştirme Kiti (JDK) • Java programlarını geliştirmek için gereken araçları ve diğer bileşenleri içerir. • Örnek araçlar: • javac: java dosyalarını derleyip class dosyası haline getirir. • javap: class dosyalarını okunabilir byte kod satırlarına çevirir. • jdb: java programlarında hata ayıklamak için kullanılır. • JDK kurulumu: http://www.oracle.com/technetwork/java/javase/downloads/index.html Javac komutu ile Java programlarının derlenmesi • Javac komutu Java kaynak kodlarından (*.java), JVM de çalışabilir Java byte kodlar (*.class) oluşturmayı sağlar. • HelloWorld.java isimli Java programından HelloWorld.class isimli byte kod dosyası oluşturmak için aşağıdaki komut çalıştırılmalıdır. javac HelloWorld.java Eclipse IDE • Java’da yazılmış entegre geliştirme ortamı (IDE) • Eklentiler aracılığıyla pek çok programlama dilini destekliyor • Java geliştirme araçları: • Kaynak kod editorü: • Dil spesifik kod renklendirme • Kod otomatik tamamlama • Java kodlarının oluşturulması ve yeniden yapılandırılması (refactoring) için özellikler • Proje oluşturma, çalıştırma ve hata ayıklama • Eclipse kurulumu • bim206-eclipse.zip dosyasını bilgisayarınıza açın • Çalıştırılabilir dosya: eclipse.exe (Çalışması için JDK’nın kurulu olması gerekli) Temel veri tipleri • byte: 8 bit, değer aralığı: -128 ... 127 • short: 16 bit, değer aralığı: -32768 ... 32767 • int: 32 bit, değer aralığı: -231 ... 231 − 1 • long: 64 bit, değer aralığı: -263 ... 263 − 1 • float: 32-bit tek duyarlıklı (single-precision) ondalıklı sayı • double: 64-bit çift duyarlıklı (double-precision) ondalıklı sayı • boolean: iki değer alabilen veri tipi: true ve false • char: 16-bit evrensel kod (Unicode) karakter Operatörler • Atama: = • Aritmetik: + - * / % • Tek terimli: + - ++ -- ! • Eşitlik: == != • İlişkisel: > >= < <= • Koşullu: && || • Tip Karşılaştırma: instanceof • Bitsel: ~ & | ^ • Bit kaydırma: << >> >>> Akış Kontrolü • If-then • If-then-else • Switch • While • Do-while • For • Branching: break, continue, return Sınıflar • Programcı tarafından tanımlanan veri tipleridir • Nesne: sınıfın bir örneğidir • Sınıf tanımı, sınıfın adında bir Java dosyası içerisinde yapılır: <SınıfAdı>.java • Sınıf adları geleneksel olarak büyük harfle başlar • Sınıf üyeleri: değişkenler (fields) and metotlar (methods) • Değişkenler: nesne içerisindeki değişkenlerdir • Temel veri tipi veya sınıf tipi • Metotlar: Java komutlarını içeren prosedürlerdir (functions?) Örnek: MyClass.java class MyClass { int myVariable; int getVariable() { return myVariable; } void setVariable(int value) { myVariable = value; } } Sınıf Üyelerine Erişim • Sınıfın içerisinden: • Değişkenin yada metotun adı kullanılarak erişilir. • Örnekler: myVariable = 0; setVariable(0); • Opsiyonel olarak, this anahtar kelimesi kullanılabilir, e.g. this.myVariable • Yerel değişkenler alanı gölgelediği durumda gereklidir • Dışarıdaki bir sınıftan: • Nesne değişkeni + . + alanın yada metotun adı Örnekler: myObject.myVariable = 0; myObject.setVariable(0); Paketler (1/2) • Sınıflar paketler içerisinde gruplanır • Mantıksal gruplama • Sınıflara ya da sınıf üyelerine erişimin düzenlenmesi • Paket adları hiyerarşik yapıda tanımlanır • Üst seviyeden alt seviyeye doğru • Örnekler: • org.organization.product • com.company.division.product • Kaynak kodların ve derlenen dosyaların dizin hiyerarşisi paket adlandırmasına uygun olmalıdır. • Örnek: org/organization/product/MyClass.java Paketler (2/2) • Bir paket sınıflara ya da alt paketlere sahip olabilir • Örnek: «com.company.division», «com.company» paketinin alt paketidir • Tam anlamıyla tanımlanmış sınıf adları (sınıfın tam adı) paket adını içerir: • Örnek: org.organization paketindeki Product sınıfı: org.organization.Product • Farklı paketlerde aynı isimli sınıflara izin verilir • Java anahtar kelimesi: package • Sınıf tanımının bulunduğu dosyanın en üstünde kullanılır • Örnek: package org.organization; Sınıf Görünürlüğü (1/2) • Normalde sınıflar sadece tanımlı olduğu paket içerisinden görülür • Public sınıflar herhangi bir paketten görülebilir • Örnek: public class MyClass { // Sınıf tanımı } • Public bir sınıfa başka bir paketten erişebilmek için: • Ya sınıfın tam adı (paket adı ile birlikte sınıf adı) kullanılmalı • Ya da sınıf içeri aktarılmalıdır (import): • Tek bir sınıfın içeri aktarılması: import <paket_adı>.<sınıf_adı>; • Bir paketteki tüm public sınıfların içeri aktarılması: import <paket_adı>.*; Sınıf Görünürlüğü (2/2) • Örnek: • com/sirket/ilkpaket/IlkSinif.java: package com.company.firstpackage; public class FirstClass { // Sınıf tanımı } • com/sirket/ikincipaket/IkinciSinif.java: package com.company.secondpackage; import com.company.firstpackage.FirstClass; class SecondClass { FirstClass firstObject; // ... } • java.lang paketi içerisindeki sistem sınıfları içeri aktarılmadan görünür haldedir ve direk kullanılabilir Standart Java Paketleri Java Projesi Oluşturma (1/2) • File -> New -> Java Project Java Projesi Oluşturma (2/2) • Proje adını girin • «Finish» butonuna tıklayın Java Sınıfı Oluşturma (1/2) • «Package Explorer» dan projeyi seçin • File -> New -> Class Java Sınıfı Oluşturma(2/2) • Paket adını (Package) girin • Sınıf adını (Name) girin • «Bitir» butonuna tıklayın main() metotu • Yeni oluşturulan sınıfın adında dosya (HelloWorld.java) editörde açılır • main() metotunu yazın • Dosyayı kaydedin:File -> Save Uygulamayı Çalıştırmak • «Package Explorer» dan projeyi seçin • Run -> Run • main() metodu çalıştırılacaktır • Eclipse Console penceresinden programın çıktısı görülebilir Alt Sınıflar (Subclasses) • Başka bir sınıftan türetilen sınıflardır • Türetildikleri sınıfa süper sınıf ya da temel sınıf (superclass or base class) denir • Alt sınıf, temel sınıfın özelliklerini genişletir • Temel sınıfın değişkenlerini ve metotlarını miras alır • Ek değişkenler veya metotlar tanımlayabilir • Kodların yeniden kullanımını kolaylaştırır • Bir alt sınıf, diğer bir sınıf tarafından temel sınıf olarak kullanılabilir. • Direk veya dolaylı temel sınıf alt sınıf ilişkisi • Kalıtım hiyerarşisi Temel Sınıf: MyClass.java class MyClass { int myVariable; int getVariable() { return myVariable; } void setVariable(int value) { myVariable = value; } } Alt Sınıf: MySubClass.java class MySubClass extends MyClass { int subClassVariable; int getVariableSum() { return myVariable + subClassVariable; } void setVariables(int value) { subClassVariable = value; setVariable(value); } } Temel Sınıf ve Alt Sınıf Nesneleri (1/2) • Alt sınıf nesneleri aynı zamanda temel sınıfın nesneleridir • Alt sınıf nesnesi, temel sınıf tipinde bir değişkene atanabilir • Temel sınıf nesnesi bir alt sınıf nesnesi olabilir ancak olmak zorunda değildir. • Temel sınıf nesnesi, alt sınıf tipindeki değişkene atanmadan önce, alt sınıf tipine çevrilmelidir: dinamik dönüşüm (dynamic cast) • Örnek: SuperClass superObject; SubClass subObject; // ... superObject = subObject; // Her zaman güvenli subObject = (SubClass) superObject; // Çalışma zamanı kontrolü Temel Sınıf ve Alt Sınıf Nesneleri (2/2) • Eğer temel sınıf nesnesi, alt sınıfın bir nesnesi değilse, dinamik dönüşüm çalışma zamanı istisnası (run-time exception) oluşturur • instanceof operatörü çalışma zamanında örnek tipini kontrol etmek için kullanılabilir • Örnek: if (superObject instanceof SubClass) subObject = (SubClass) superObject; // Güvenli Sınıf Üyesi Görünürlüğü • Bir sınıfın üyelerine diğer sınıflardan erişimi kontrol etmek için kullanılır • Varsayılan durum: sadece paket içi görünüm (package-private visibility) • Sınıf üyelerine sadece aynı paketteki sınıflardan erişilebilir • Açık Görünürlük (public visibility): • Sınıf üyelerine herhangi bir sınıf tarafından erişilebilir • Korumalı Görünürlük (protected visibility): • Sınıf üyelerine direk veya dolaylı alt sınıflar ve aynı paketteki sınıflar tarafından erişilebilir • Gizli Görünürlük (private visibility): • Sınıf üyelerine diğer sınıflardan erişilemez Sınıf Üyesi Görünürlüğü Örneği (1/4) • com/company/firstpackage/FirstClass.java: package com.company.firstpackage; public class FirstClass { int myVariable; private int privateVariable; public void publicMethod() { } protected void protectedMethod() { } } Sınıf Üyesi Görünürlüğü Örneği (2/4) • com/company/firstpackage/SecondClass.java: package com.company.firstpackage; class SecondClass { FirstClass firstObject; void method() { firstObject.myVariable = 0; firstObject.privateVariable = 0; firstObject.publicMethod(); // firstObject.protectedMethod(); // } } // Hata yok // Hata! Hata yok Hata yok Sınıf Üyesi Görünürlüğü Örneği (3/4) • com/company/secondpackage/ThirdClass.java: package com.company.secondpackage; import com.company.firstpackage.FirstClass; class ThirdClass { FirstClass firstObject; void method() { firstObject.myVariable = 0; // Hata! firstObject.privateVariable = 0; // Hata! firstObject.publicMethod(); // Hata yok firstObject.protectedMethod(); // Hata! } } Sınıf Üyesi Görünürlüğü Örneği (4/4) • com/company/secondpackage/FourthClass.java: package com.company.secondpackage; import com.company.firstpackage.FirstClass; class FourthClass extends FirstClass { FirstClass firstObject; void method() { firstObject.myVariable = 0; // Hata! firstObject.privateVariable = 0; // Hata! firstObject.publicMethod(); // Hata yok firstObject.protectedMethod(); // Hata yok } } Sınıf Yapıcıları (1/5) • Yenir bir nesne, new operatörü kullanılarak oluşturulur: MyClass myObject = new MyClass(); • Sınıf yapıcısı: Nesne oluşturulurken otomatik çağırılan özel sınıf metotudur • Yapıcı tanımlama: MyClass(...) { // ... } • Otomatik tanımlanan varsayılan yapıcı, parametresi olmayan boş bir fonksiyondur • Eğer sınıfta bir yapıcı tanımlanrsa, bu sınıf için varsayılan yapıcı tanımlanmaz Sınıf Yapıcıları (2/5) • İstenildiği kadar yapıcı tanımlanabilir (farklı parametre listesine sahip olmaları şartıyla) • Örnek: MyClass() { // Parametresi olmayan yapıcı } MyClass(int arg0, double arg1) { // Bir «int» ve bir «double» parametre alan yapıcı } • Boş olmayan parametre listesine sahip bir yapıcıyı çağırma örneği: MyClass myObject = new MyClass(arg0, arg1); Sınıf Yapıcıları (3/5) • Bir yapıcı, diğer bir yapıcıyı çağırabilir • Yapıcı çağırma şekli: this(...) • Örnek: MyClass() { this(0, 0.1); } MyClass(int arg0, double arg1) { // Bir «int» ve bir «double» parametre alan yapıcı } Sınıf Yapıcıları (4/5) • Sınıf yapıcıları genellikle sınıf değişkenlerine ilk değer atamak için kullanılır • Yapıcılar dışında, değişken tanımlama sırasında da ilk değer ataması yapılabilir • Değişkenlere ilk değer atanmaması durumunda varsayılan değerleri kullanılır: • Sayısal değişken tipleri için 0 • Boolean tip için false • Sınıf tipleri için null Sınıf Yapıcıları (5/5) Sınıf değişkeni ilk değer atama örneği: class MyClass { int zeroField; // varsayılan değer: 0 int myField = 1; MyClass() { } MyClass(int value) { myField = value; } } // ... MyClass firstObject = new MyClass(); // firstObject.myField = 1 MyClass secondObject = new MyClass(2); // secondObject.myField = 2 Temel Sınıfların Yapıcıları • Varsayılan yapıcılar kullanıldığında: alt sınıf yapıcısı, temel sınıf yapıcısı çağırıldıktan sonra çağırılır • Varsayılan yapıcı dışında bir yapıcı tanımlanmazsa, parametresi olmayan temel sınıf yapıcısı otomatik çağırılır • Varsayılan yapıcı dışındaki yapıcıları çağırmak için: super(...) • Örnek: SuperClass(int value) { } SubClass() { super(0); } • Temel sınıf yapıcısı çağırımı, alt sınıf yapıcısının ilk satırında yapılmalıdır Diziler (1/2) • Belirli bir tipte, sınırlı sayıda değer içeren nesnelerdir • Temel veri tiplerinde (int, double) veya sınıf tiplerinde (MyClass) değerler içerebilirler • Örnekler: • int[] arrayOfInts; • MyClass[] arrayOfObjects; • Dizi uzunluğu (dizinin kaç değer içereceği) dizi oluşturma zamanında belirlenir • Örnekler: arrayOfInts = new int[2]; arrayOfObjects = new MyClass[3]; • Dizi uzunluğuna length üye değişkeni ile ulaşılabilir: • Örnek: arrayOfInts.length Diziler (2/2) • Dizi elemanlarının ilk değerlerinin atanması: • {ilkDeger, ikinciDeger, ...} • Örnekler: int[] arrayOfInts = {10, 20}; MyClass[] arrayOfObjects = {firstObj, secondObj}; • Dizi üyelerine erişim: • arrayName[index] • Geçerli indeks değerleri: 0 ... arrayName.length – 1 • Örnekler: arrayOfInts[0] = 0; arrayOfObjects[1].method(); Diziler Üzerinde Dolaşma • Gelişmiş for (enhanced for) döngüsü: indeks değişkenine gerek duymaz • Kullanım: for (<type> <variable> : <array_name>) {} • <type> temel veri tipleri ya da sınıf tipleri olabilir • Örnek: MyClass[] array; for (MyClass item : array) { // item dizinin o anki değerini tutar ve her adımda güncellenir } String Nesneleri • Java’da string değişkenleri java.lang.String sınıfından türetilmiş nesnelerdir • Java dilinde hazır gelen string desteği: • Çift tırnak içerisindeki karakterlerden String nesnesi oluşturulur • Örnek: String myString = "merhaba dünya"; • + operatörü ile string birleştirme • Örnek: String myString = "merhaba " + "dünya"; • + operatörü kullanılarak string değişkenler ile birleştirilen değişkenler ve sabitler otomatik olarak string nesnelerine dönüştürülürler • Örnek: String strZeytin = "dün " + 2 + " kilo zeytin aldım"; Statik Üyeler (1/2) • Normal şartlarda, sınıf üyelerine (değişkenler ve metotlar), nesneler aracılığıyla erişilebilir • Örnekler: myObject.myField = 0; myObject.setField(0); • Ve sınıf üyeleri nesne değişkenleridir (instance variables): • obj1.field ve obj2.field iki farklı değişkendir • Sınıfa ait üyelere statik üyeler (static fields) denir : • Sınıf örneklerinden bağımsız üyelerdir • Sınıf değişkenleridirler: Sınıfın tüm nesneleri tarafından paylaşılırlar • Nesne adı yerine, sınıf adı kullanılarak erişilirler Statik Üyeler (2/2) • Örnek: class MyClass { static int staticVariable; static void staticMethod() { ... } } MyClass.staticVariable = 0; MyClass.staticMetohd(); • Görünürlük anahtar kelimeleri (public, protected, private): Statik olmayan üyeler için geçerli kurallar statik üyeler için de geçerlidir. Main Metotu • Bir Java programı çalıştırıldığında otomatik çalıştırılan metot: • public static void main(String[] args) • Parametre: Program çalıştırılırken gönderilen parametreleri içeren String dizisidir. (Eğer parametre gönderilmemişse boş dizi gönderilir.) • Örnek: public class HelloWorld { public static void main(String[] args) { If (args.length > 0) System.out.println(args[0]); } } Metot Yeniden Tanımlama (Method Override) (1/2) • • • • Alt sınıflar, temel sınıfın metotlarını miras alırlar Ancak bir alt sınıf isterse bir temel sınıf metotunu yeniden tanımlayabilir Alt sınıftaki metota, yeniden tanımlanmış metot (overridden method) denir Örnek: class SuperClass { void method() { } } void overriddenMethod() { } Metot Yeniden Tanımlama (Method Override) (2/2) • Örnek (devamı): class SubClass extends SuperClass { void overriddenMethod() { } } subClassObj.method(); // Temel sınıf metotu subClassObj.overriddenMethod(); // Alt sınıf metotu • Yeniden tanımlanmış metotun temel sınıftaki versiyonu «super» anahtar kelimesi kullanılarak alt sınıftan çağırılabilir • Örnek: super.overriddenMethod(); Final Üyeler ve Final Sınıflar • İlk değer atandıktan sonra final üyelerin değeri değiştirilemez. • Bu nedenle, değerleri ilk değer atanırken verilmelidir • Üye tanımlanırken - hem statik hem de statik olmayan üyeler için bu yöntem kullanılablir veya • Her bir yapıcının içerisinde ilk değer atanabilir - sadece statik olmayan üyeler için kullanılabilir • Final metotlar alt sınıflarda yeniden tanımlanamazlar • Final sınıflardan alt sınıf oluşturulamaz • Örnek: class MyClass { final int finalField = 0; void method() { finalField = 1; // Hata! } } Soyut Sınıflar (Abstract Classes) • Direk olarak nesnesi oluşturulamayan sınıflardır • Sadece alt sınıflarından nesne oluşturulabilir • Örnek: abstract class MyClass { } class SubClass extends MyClass { } MyClass myObject = new MyClass(); // Hata! MyClass myObject = new SubClass(); // Hata yok Soyut Metotlar (Abstract Methods) • Geröekleştirimş olmayan metotlardır • Örnek: abstract void abstractMethod(); • Soyut metotu bulunan sınıflar, soyut sınıf olarak tanımlanmalıdır • Soyut bir sınıfın alt sınıfı: • Ya miras ile alınan soyut metotları gerçekleştirir • Ya da soyut bir sınıf olabilir Soyut Bir Sınıftan Alt Sınıf Oluşturmak • Örnek: class AbstractClass { abstract void abstractMethod(); } class SubClass extends AbstractClass { void abstractMethod { // Miras ile alınan soyut metotun gerçekleştirimi } } Arayüzler (Interfaces) • Java’da sadece türetilen sınıfların sadece tek bir temel sınıfı olabilir • Çoklu kalıtım (multiple inheritence) arayüzler aracılığıyla sağlanır • Soyut sınıflar gibi, hangi fonksiyonları içerdiği belli ama gerçekleştirimi olmayan yapılardır • Tüm değişkenler public, static ve final tanımlıdır. • Tanımlanan tüm metotlar public tanımlıdır. • Yapıcı içeremezler. • Örnek: interface MyInterface { } int field = 0; void interfaceMethod(); Arayüz Gerçekleştirimi (1/2) • Bir sınıf, arayüzdeki tanımlı metotları gerçekleştirerek, bir arayüzü gerçekleştirebilir • Örnek: class MyClass implements MyInterface { void interfaceMethod() { // arayüz metotunun gerçekleştirimi } } • Eğer arayüzü gerçekleştiren sınıf soyut bir sınıfsa, arayüz metotlarını gerçekleştirmeyebilir. • Bu durumda, arayüz metotları, soyut sınıfın alt sınıfları tarafından gerçekleştirilmelidir Arayüz Gerçekleştirimi (2/2) • Bir sınıf birden fazla arayüzü gerçekleştirebilir (çoklu kalıtım!) • Örnek: class MyClass implements FirstInterface, SecondInterface { void firstInterfaceMethod() { // FirstInterface arayüzündeki metotun gerçekleştirimi } void secondInterfaceMethod() { // SecondInterface arayüzündeki metotun gerçekleştirimi } } Anonim Sınıflar (Anonymous Classes) • Bir sınıfı aynı zamanda tanımlamayı ve bu sınıftan yeni nesne oluşturmayı sağlar • Ya var olan bir sınıftan yeni sınıf türetilmeli ya da var olan bir arayüz gerçekleştirilmelidir • Kullanım: • new operatörü • Yeni sınıf türetilecek sınıfın ya da gerçekleştirilecek arayüzün adı • Yapıcı parametrelerini içeren parantezler • Arayüz imlementasyonu ise, içi boş parantezler • Anonim sınıfın içeriği • Temel sınıf ya da arayüz metotlarının (yeniden) gerçekleştirimi Anonim Sınıf Örneği MyInterface anonymous = new MyInterface() { public void interfaceMethod() { // arayüz metotunun gerçekleştirimi } }; anonymous.interfaceMethod(); İstisnalar (Exceptions) (1/5) • İstisnalar, hatalı durumların yakalanmasını ve kontrol edilmesini sağlarlar • java.lang.Exception sınıfından türetilirler • Hatayla karşılaşan kod istisna ortaya çıkarır (throw an exception) • Hatanın kontrol edilmesini sağlayan kod istisnayı yakalar (catch the exception) • İstisna ortaya çıkaran kod örneği: boolean error; if (error) throw new Exception("Error condition"); İstisnalar (Exceptions) (2/5) • Ortaya çıkan bir istisna normal program akışını yarıda keser • İstisna yakalanana kadar metot çağırım yığınında (method call stack) yukarı doğru ilerler • Bir istisnanın yakalanması örneği: try { // İstisna üretebilecek birşeyler yap } catch (Exception e) { // Hata durumunu kontrol et String errorMsg = e.getMessage(); // ... } İstisnalar (Exceptions) (3/5) • Metotlar bir istisna ortaya çıkarabileceklerini throws ifadesi ile belirtirler • Bu metotları çağıran metotlar, ya bu istisnayı yakalamalıdır ya da throws ifadesini kullanmalıdır • Örnek: void method() throws Exception { // ... } try { method(); } catch (Exception e) { // ... } İstisnalar (Exceptions) (4/5) • Exception alt sınıfları tanımlanabilir • throws ifadesi birden fazla istisna tipini belirtebilir • Birden fazla catch ifadesi kullanılarak farklı istisna tiplerinin farklı şekillerde kontrol edilmesi sağlanabilir • İstisna sadece ilk uyumlu catch ifadesi tarafından kontrol edilir • Örnek: try { // ... } catch (ExceptionSubClass e) { // ... } catch (Exception e) { // ... } İstisnalar (Exceptions) (5/5) • İstisna oluşması durumunda dahi çalışması istenilen kod parçacıkları finally bloğu içerisine yazılır • Örnek: try { // ... } catch (Exception e) { // ... } finally { // try-catch bloğundan sonra çalıştırılır } Denetlenmeyen İstisnalar (Unchecked Exceptions) (1/2) • Normal istisnalar denetlenen istisnalardır (checked exceptions) • Metotlar try-catch bloğuna sahip olmalı yada throws idadesini kullanmalıdır • Derlenme zamanında bu kural kontrol edilir • Denetlenen istisnalar gereksiz kod yazımına neden olabilir • Bir istisna hiç bir zaman gerçekleşmeyecek olsa bile, kontrol edilmelidir (yakalanmalıdır) • Denetlenmeyen istisnaların kontrol edilmesi zorunlu değildir • Ancak eğer gerekli ise kontrol edilebilir • java.lang.RuntimeException ve bu sınıfın alt sınıfları denetlenmeyen istisnalardır Denetlenmeyen İstisnalar (Unchecked Exceptions) (2/2) • RuntimeException sınıfının java.lang paketinde bulunan ve sık karşılaşılan alt sınıfları: • ClassCastException: eğer temel sınıftan alt sınıfa dinamik çevrim gerşekleştirilemezse • IllegalArgumentException: eğer bir metota, kabul edilemeyecek bir parametre gönderilirse • IndexOutOfBoundsException: eğer varolmayan bir dizi elemanına erişilmeye çalışılmışsa • NullPointerException: eğer nesne referansı hafızada yer almayan bir nesneyi gösteriyorsa ve nesnenin üyesine erişilmeye çalışılırsa (nesne değişkeni: null) java.lang.Object • Tüm sınıfların temel sınıfıdır • Tüm sınıflar Object sınıfının üyelerini miras alır (extends anahtar kelimesi ile belirtilse de belirtilmese de) • toString() metotu • Nesnenin String olarak açıklamasını döndürür • Bir nesne + operatörü kullanılarak bir string ile birleştirildiğinde otomatik olarak çağırılır • Alt sınıflar tarafından yeniden tanımlanabilir • Örnek: // aşağıdaki iki kullanım aynı sonucu üretir objString = "Nesne: " + myObject; objString = "Nesne: " + myObject.toString(); Girdi/Çıktı Akışları (Input/Output Streams) • Büyük miktardaki verilerin yığınlar halinde aktarılmasını sağlar • Kullanım örnekleri: • Doksyadan okumak, dosyaya yazmak • Ağ veri transferi • java.io.IOException • java.lang.Exception sınıfının alt sınıfıdır • Bir I/O işlemi başarısız olduğunda ya da yarıda kaldığında ortaya çıkar • java.io.InputStream • java.io.OutputStream java.io.InputStream (1/2) • Aşağıdaki temel metotlara sahip soyut sınıf: • abstract int read() throws IOException • Girdi akışından bir byte okur. Okuduğu byte’ı döndürür ya da akışın sonu geldiyse -1 döndürür • int read(byte[] b, int off, int len) throws IOException • En fazla len kadar byte okur ve okunan byte’ları off pozisyonundan başlayarak b dizisine yerleştirir • Eğer akışın sonuna gelindiyse -1 döndürür. Aksi halde okunan byte sayısını döndürür • int read(byte[] b) throws IOException • read(b, 0, b.length)ile aynı şeyi yapar • void close() throws IOException • Girdi akışını kapatır ve bu amaçla kullanılan bütün kaynakları sisteme iade eder java.io.InputStream (2/2) • Kullanım Örneği: InputStream is; byte[] buffer = new byte[1024]; int byteCount; // ... try { while ((byteCount = is.read(buffer)) >= 0) { // okunan byte’ları amaca uygun şekilde işle } is.close(); } catch (IOException e) { // hata durumlarını kontrol et } java.io.OutputStream • Aşağıdaki temel metotlara sahip soyut sınıf: • abstract void write(int b) throws IOException • Bir byte’lık bilgiyi çıktı akışına yaz • void write(byte[] b, int off, int len) throws IOException • len kadar byte’ı b dizisinin off pozisyonundan başlayarak oku ve çıktı akışına yaz • void write(byte[] b) throws IOException • write(b, 0, b.length) ile aynı şeyi yapar • void close() throws IOException • Çıktı akışını kapatır ve bu amaçla kullanılan bütün kaynakları sisteme iade eder java.io.FilterInputStream (1/2) • java.io.InputStream sınıfından türetilmiş sınıf • Girdi akışından okunan bilginin değiştirilmesini (filtrelenmesini) sağlar • Yapıcısına iletilen bir InputStream üzerinde çalışır • İletilen InputStream protected in değişkeninde tutulur • Amaca uygun filtreleme işleminin gerçekleştirilmesi için bu sınıftan bir alt sınıf oluşturulmalıdır • Alt sınıflar şu metotları yeniden tanımlamalıdır: • int read() • int read(byte[] b, int off, int len) java.io.FilterInputStream (2/2) • Örnek: public class SimpleFilterInputStream extends FilterInputStream { public SimpleFilterInputStream(InputStream in) { super(in); } public int read() throws IOException { int b = in.read(); if (b == 0) b = 1; return b; } public int read(byte[] b, int off, int len) throws IOException { int byteCount = in.read(b, off, len); for (int i = 0; i < byteCount; i++) if (b[off + i] == 0) b[off + i] = 1; return byteCount; } } java.io.FilterOutputStream (1/2) • java.io.OutputStream sınıfından türetilmiş sınıf • Çıktı akışına yazılan bilginin değiştirilmesini (filtrelenmesini) sağlar • Yapıcısına iletilen bir OutputStream üzerinde çalışır • İletilen OutputStream protected out değişkeninde tutulur • Amaca uygun filtreleme işleminin gerçekleştirilmesi için bu sınıftan bir alt sınıf oluşturulmalıdır • Alt sınıflar şu metotları yeniden tanımlamalıdır: • void write(int b) • void write(byte[] b, int off, int len) java.io.FilterOutputStream (2/2) • Örnek: public class SimpleFilterOutputStream extends FilterOutputStream { public SimpleFilterOutputStream(OutputStream out) { super(out); } public void write(int b) throws IOException { if (b == 1) b = 0; out.write(b); } public void write(byte[] b, int off, int len) throws IOException { for (int i = 0; i < len; i++) if (b[off + i] == 1) b[off + i] = 0; out.write(b, off, len); } } java.io.PrintStream • FilterOutputStream sınıfından türetilmiş alt sınıf • Çıktı akışına temel veri tiplerini (int, double vb.) ve nesnelerin string açıklamalarını yazmak için kullanılır • Hiçbir zaman IOException ortaya çıkarmaz • checkError() metotu kullanılarak hata oluşup oluşmadığı kontrol edilebilir • printf() stili, istenilen formatta yazmayı sağlayan, metotlar sunar • Otomatik olarak bir alt satıra geçiren println() metotları sunar java.lang.System • «Final» sınıf • Bu sınıftan yeni bir nesne oluşturulamaz (public yapıcısı yoktur) • Sadece «static» olan sınıf üyeleri kullanılır • InputStream in: standart girdi • PrintStream out: standart çıktı • PrintStream err: standart hata • void gc(): çöp toplayıcısını (garbage collector) çalıştırır • void exit(int status): JVM’i sonlandırır • Durum kodu: 0 ise normal sonlandırma, başka bir değerse anormal sonlandırma Açıklama Notları (Annotations) • Java kaynak kodları için üst veriler (metadata) • Tanımlamalara uygulanır • Sınıfların, değişkenlerin, metotların ve yerel değişkenlerin tanımlanmalarında üst veri bildirmek için kullanılır • @ karakteri ile başlar • Ön tanımlı açıklama tipleri: • @Deprecated • @Override • @SuppressWarnings • Warning types: deprecation, unused, null • Örnek: @SuppressWarnings("unused")