1 EXCEPTION HANDLING Exception Handling dapat dianggap sebagai Struktur Kendali Non-Lokal Bug : kesalahan yang merupakan kelemahan dari perancangan at...
EXCEPTION HANDLING Exception Handling dapat dianggap sebagai Struktur Kendali Non-Lokal Bug : kesalahan yang merupakan kelemahan dari perancangan atau implementasi Exception : kesalahan yang dihasilkan oleh kondisi sistem /lingkungan kondisi abnormal (sesuatu diluar yang biasanya) yang muncul di sekuen (urutan) kode saat jalan run-time error Exception menyediakan pembangkitan kesalahan serta cara menanganinya. Struktur kendali ini memungkinkan kita menspesifikasikan dimana kita dapat menangani suatu tipe kesalahan secara pasti. Exception menyediakan sarana mengkomunikasikan informasi kesalahan lewat suatu rantai metode, sampai terdapat satu metode yang menanganinya. Exception di Java merupakan subkelas dari kelas java.lang.Throwable. Exception adalah objek, maka memiliki data dan metode.
KATA KUNCI untuk Exception Handling : a) b) c) d) e)
try catch throw throws finally
Ringkasan kerja : 1. program yang hendak dimonitor untuk exceptionnya dimuat dalam try 2. jika exception terjadi didalam blok try, exception itu dilemparkan 3. kode dapat menangkap (catch) exception menggunakan catch dan menangani dengan suatu cara yang rasional 4. exception yang dibangkitkan sistem secara otomatis dilempar oleh sistem Java, sedangkan untuk exception yang dilemparkan secara manual maka digunakan keyword throw. 5. exception yang dilempar oleh metode harus di spesifikasikan dengan klausa throws. 6. Sembarang kode yang secara absolut harus dieksekusi sebelum metode keluar diletakkan di blok finally.
JENIS EKSEPSI Exception dapat dibangkitkan oleh Java run-time system atau dibangitkan secara manual oleh kode program : A. Exception yang dilempar Java run-time system berhubungan dengan kesalahankesalahan fundamental yang melanggar aturan-aturan bahasa Java atau batasan-batasan lingkungan eksekusi Java B. Exception yang dihasilkan secara manual, umunya digunakan untuk melaporkan kondisi kesalahan ke pemanggil metode
1
EXCEPTION TIDAK TERTANGKAP public class DivByZeroToy { /** Creates a new instance of DivByZeroToy */ public DivByZeroToy() { } public static void main (String args[]) { int zeroInt = 0; int anInt = 10; int divResult = anInt / zeroInt; } } Hasil : java.lang.ArithmeticException: / by zero at DivByZeroToy.main(DivByZeroToy.java:10) Exception in thread "main" Tahap-tahap kejadian : 1. ketika sistem Java mendeteksi usaha membagi dengan nol, maka sistem membangun objek Exeption baru, dan kemudian melemparkan Exception. 2. aksi ini menyebabkan eksekusi DivByZeroToy berhenti, karena begitu satu Exception dileparkan, maka Exception harus ditangkap oleh penanganan Exception yang harus segera menanganinya. 3. karena tidak ada penanganan Exception, maka Exception ditangkap oleh penanganan sistem Java. sembarang Exception yang tidak ditangkap oleh kode program akan ditangkap oleh penanganan default. penanganan Exception menampilkan String yang mendeskripsikan Exception mencetak jejak stack dari saat dimana Exception terjadi mengakhiri program
try dan catch Untuk menanggapi exception, pemanggilan terhadap metode yang menghasilkan Exception harus ditempatkan di dalam blok try. blok try adalah blok kode yang dimulai kata kunci try diapit pasangan kurung kurawal { }. setiap blok try diasosiasikan dengan satu blok catch atau lebih. Jika metode dimaksudkan untuk menangkap Exception yang dilempar oleh metode yang dipanggil, maka pemanggilan harus ditempatkan di blok try. blok-blok catch menangani tipe exception berbeda yang dilempar. Kalimat try dan catch membentuk satu unit. blok catch tidak dapat menangkap Exception yang dilempar kalimat try yang lain tujuan dari klausa catch seharusnya mampu menyelesaikan kondisi kekecualian dan kemudian melanjutkan seolah-olah kesalahan tidak pernah terjadi. Manfaat penanganan Exception sendiri : memungkinkan untuk peniadaan kesalahan mencegah program dihentikan oleh system Java secara otomatis dapat memberikan tambahan informasi yang berguna untuk pemakai aplikasi atau untuk kegiatan debugging 2
Metode dapat mempunyai blok untuk menangkap beberapa tipe Exception sekaligus. Java mendukung banyak blok catch. masing-masing blok catch harus menspesifikasikan tipe Exception yang berbeda. public class BanyakCatch { public BanyakCatch() { } public static void main(String args[]) { int anInt = 10; try { int divBy = args.length; int divResult = anInt / divBy; System.out.println("Hasilnya adalah : " + divResult); int c[]={1}; c[10]=100; } catch (ArithmeticException e) { System.out.println("Terjadi pembagian dengan nol"); System.out.println("Diatasi blok penanganan A"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Terjadi Indeks Array diluar batas"); System.out.println("Diatasi blok penanganan B"); } System.out.println("Kalimat Setelah Catch"); } } Hasil : Terjadi pembagian dengan nol Diatasi blok penanganan A Kalimat Setelah Catch
3
finally Java menyediakan klausa finally untuk menandai blok itu selalu dieksekusi. Pada situasi normal (tidak ada Exception yang dilempar), blok finally di eksekusi segera setelah blok try. Ketika Exception dilempar, blok finally dieksekusi setelah blok catch yang menangani Exception dilakukan. public class BanyakCatch2 { public BanyakCatch2() { } public static void main(String args[]) { int anInt = 10; try { int divBy = args.length; int divResult = anInt / divBy; System.out.println("Hasilnya adalah : " + divResult); int c[]={1}; c[10]=100; } catch (ArithmeticException e) { System.out.println("Terjadi pembagian dengan nol"); System.out.println("Diatasi blok penanganan A"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Terjadi Indeks Array diluar batas"); System.out.println("Diatasi blok penanganan B"); } finally { System.out.println("FINALLY"); } } } Hasil : Terjadi pembagian dengan nol Diatasi blok penanganan A FINALLY
4
Java Built-in Exception Java mendefinisikan beberapa Exception yang akan dilempar sistem Java secara otomatis. Exception ini tidak usah didaftarkan di daftar Exception di klausa throws. kebanyakan Exception ini adalah subkelas RuntimeException. di Java, Exception- exception ini disebut sebagai Unchecked Exception (Exception yang tidak diperiksa), karena kompilator Java tidak memeriksa apakah metode menangani atau melempar Exception ini. Hirarki Exception yang terdapat di java.lang : OBJECT
Throwable Exception sub kelas dari Throwable Superkelas dari dari semua Exception ClassNotFoundException CloneNotSupportedException IllegalAccessException InstantiationException InterruptedException NoSuchMethodException NoSuchFieldException RunTimeException 1. ArithmeticException (U) 2. ArrayStoreException (U) 3. ClassCastException (U) 4. IllegalArgumentException (U) a) IllegalThreadStateException (U) b) NumberFormatException (U) 5. IllegalStateException (U) 6. IllegalMonitorStateException (U) 7. IndexoutOfBoundsException (U) c) ArrayIndexoutOfBoundsException (U) d) StringIndexoutOfBoundsException (U) 8. NegativeArraySizeException (U) 9. NullPointerException (U) 10. SecurityException (U)
Keterangan : U = Unchecked Exception
5
throw & throws a. throw kata kunci throw digunakan di program untuk melempar (throw) terhadap Exception secara eksplisit. throw ThrowableInstance ThrowableInstance harus merupakan objek dengan tipe Throwable atau subkelas dari Throwable. terdapat dua cara kita memperoleh objek Throwable : 1. menggunakan parameter di klausa catch 2. menciptakan salah satu dengan menggunakan operator new Eksekusi program akan dihentikan segera setelah kalimat throw kalimat-kalimat setelah kalimat throw tidak dieksekusi Java akan melakukan inspeksi blok try terdekat untuk menemukan kalimat catch yang cocok dengan tipe Exception yang dilempar jika Java menemukannya, maka kendali program ditransfer ke kalimat catch itu jika tidak ditemukan, maka Java akan melakukan penelusuran ke blok try berikutnya sampai ke puncak stack dan bila tetap tidak ditemukan, maka penanganan Exception secara default akan melaksanakan tugasnya : a. menghentikan program b. mencetak jejak penelusuran stack public class ThrowToy { public ThrowToy() { } static void throwException() throws Exception{ try { throw new Exception("Demo terhadap kalimat throw"); } catch (Exception e) { System.out.println("Penangkapan exception di test"); throw e; // Exception kembali dilemparkan} } } static void test(){ try { throwException(); }catch (Exception e) { //menangkap exception System.out.println("Kembali ditangkap exception: " + e);} } public static void main (String args[]) { test(); } } Hasil : Penangkapan exception di test Kembali ditangkap exception: java.lang.Exception: Demo terhadap kalimat
6
b. throws Klausa Throws mendaftarkan tipe-tipe Exception yang dapat dilempar metode hal ini diperlukan agar diketahui semua Exception yang mungkin dilempar metode atau subkelassubkelasnya semua Exception yang hendak dilempar metode harus dideklarasikan di klausa throws jika metode melemparkan Exception yang tidak didelarasikan di deklarasi metode, maka kompilator akan memberikan pesan kesalahan. <method-modifier> type method-name throws exception-list { //badan metode } exception-list adalah daftar exception yang dipisahkan dengan koma, yang berisi daftar Exception yang dapat dilempar metode public class ThrowsToy { public ThrowsToy() { } static void throwsException() throws IllegalAccessException { System.out.println("Di dalam throwsException."); throw new IllegalAccessException("Exception di throwsException"); } public static void main (String args[]) { try {throwsException(); }catch (IllegalAccessException e) { //menangkap exception System.out.println("Ditangkap exception: " + e); } } } Hasil : Di dalam throwsException. Ditangkap exception: java.lang.IllegalAccessException: Exception di throwsException
di dalam metode main() harus didefinisikan kalimat try / catch yang menangkap Exception yang dikirim metode throwsException. bila kita tidak mendefinisikan, maka kompilator akan menyatakan terdapat kesalahan dengan menggunakan throws di deklarasi metode dan throw di dalam metode untuk melemparkan Exception yang muncul di metode, maka kita akan dapat memaksakan metode pemanggil untuk menangani Exception yang dilemparkan padanya.
7
public class ThermometerNextNextToy { private double valueInCelcius; /** Creates a new instance of ThermometerSmartToy */ public ThermometerNextNextToy() { valueInCelcius = 0; } public ThermometerNextNextToy(double newValue) throws Exception{ valueInCelcius = newValue; if (valueInCelcius < -272.0) { Exception E = new Exception("Tidak boleh kurang dari -272 Derajat Celcius"); throw (E); } } // Accessing operations public void setInCelcius (double newValue) throws Exception{ valueInCelcius = newValue; if (valueInCelcius < -272.0) { Exception E = new Exception("Tidak boleh kurang dari -272 Derajat Celcius"); throw (E); } } public void setInReamur (double newValue) throws Exception{ valueInCelcius = (5/4) * newValue; if (valueInCelcius < -272.0) { Exception E = new Exception("Tidak boleh kurang dari -272 Derajat Celcius"); throw (E); } } public void setInFahrenheit (double newValue) throws Exception { valueInCelcius = (5/9) * (newValue - 32); if (valueInCelcius < -272.0) { Exception E = new Exception("Tidak boleh kurang dari -272 Derajat Celcius"); throw (E); } } public void setInKelvin (double newValue) throws Exception { valueInCelcius = newValue - 272; if (valueInCelcius < -272.0) { Exception E = new Exception("Tidak boleh kurang dari -272 Derajat Celcius"); throw (E); } } public double getInCelcius () { return valueInCelcius; } public double getInReamur () { return ((4/5) * valueInCelcius); }
8
public double getInFahrenheit () { return (((9/5) * valueInCelcius) + 32); } public double getInKelvin () { return (valueInCelcius + 272); } static void test(){ ThermometerNextNextToy t; System.out.println("Pengujian"); System.out.println("Aplikasi Thermometer"); System.out.println("Nilai Celcius Yang Dimasukkan adalah 50"); System.out.println("Dengan Penanganan Kondisi Pemasukan Nilai Tak Absah"); System.out.println("Memanfaatkan Structured Exception Handling"); System.out.println("================================================= =="); try { t = new ThermometerNextNextToy(0.0); System.out.println("Nilai di Celcius : "+t.getInCelcius()); System.out.println("Nilai di Reamur : "+t.getInReamur()); System.out.println("Nilai di Fahrenheit : "+t.getInFahrenheit()); System.out.println("Nilai di Kelvin : "+t.getInKelvin()); try { t.setInCelcius(50.0); System.out.println("Nilai di Celcius : "+t.getInCelcius()); System.out.println("Nilai di Reamur : "+t.getInReamur()); System.out.println("Nilai di Fahrenheit : "+t.getInFahrenheit()); System.out.println("Nilai di Kelvin : "+t.getInKelvin()); } catch (Exception e) { System.out.println ("Exception : " + e.getMessage()); } try { t.setInCelcius(-273.0); System.out.println("Nilai di Celcius : "+t.getInCelcius()); System.out.println("Nilai di Reamur : "+t.getInReamur()); System.out.println("Nilai di Fahrenheit : "+t.getInFahrenheit()); System.out.println("Nilai di Kelvin : "+t.getInKelvin()); } catch (Exception e) { System.out.println ("Exception : " + e.getMessage()); } } catch (Exception e) { System.out.println ("Exception : " + e.getMessage()); } }
9
public static void main(String[] args){ test(); } } Hasil : Pengujian Aplikasi Thermometer Nilai Celcius Yang Dimasukkan adalah 50 Dengan Penanganan Kondisi Pemasukan Nilai Tak Absah Memanfaatkan Structured Exception Handling =================================================== Nilai di Celcius : 0.0 Nilai di Reamur : 0.0 Nilai di Fahrenheit : 32.0 Nilai di Kelvin : 272.0 Nilai di Celcius : 50.0 Nilai di Reamur : 0.0 Nilai di Fahrenheit : 82.0 Nilai di Kelvin : 322.0 Exception : Tidak boleh kurang dari -272 Derajat Celcius