• Tidak ada hasil yang ditemukan

Hirarki Class Exception

Dalam dokumen c2ed0 java desktop ifnu bima (Halaman 60-63)

}

Perhatikan bahwa class ExceptionPertama di atas harus menextends class Exception yang sudah disediakan oleh JDK. Dalam kode di atas ada dua buah keyword yang belum kita bahas yaitu super dan extends, tidak perlu khawatir tentang dua buah keyword tersebut, kita akan membahasnya nanti di bab tentang OOP, sekarang fokuskan perhatian ke bagaimana cara membuat class exception.

Setelah class exception dibuat seperti di atas, kita akan membuat kode sederhana yang menggunakan class exception di atas. Perhatikan kode di bawah ini :

public class ExceptionPertamaTest {

public static void main(String[] args) { try{

System.out.println("eksekusi exception pertama");

throw new ExceptionPertama("ini pesan exception pertama"); } catch(ExceptionPertama ex){

ex.printStackTrace(); }

} }

Class di atas mendemonstrasikan bagaimana class exception yang sudah kita buat digunakan. Terlihat ada sintaks try-catch yang digunakan untuk menghandle exception yang kita throw. Tidak perlu khawatir tentang apa itu keyword throw, kita akan bahas di bab selanjutnya.

Class exception secara default akan mempunyai semua method yang dipunyai oleh class Exception, salah satu method yang sering digunakan adalah printStackTrace. Fungsi ini gunanya adalah untuk menampilkan stack trace ke console. Kalau sudah lupa apa itu stack trace, silahkan buka-buka lagi bab sebelumnya yang membahas stack trace.

Seperti yang kita lihat, cara membuat class exception yang spesifk untuk aplikasi kita sangat mudah, silahkan buat class exception yang mendeskripsikan error yang spesifk, hal ini memudahkan analisa stack trace kalau terjadi exception dalam aplikasi.

Hirarki Class Exception

Dalam bab ini kita akan membahas hirarki class exception, kita belum membahas konsep OOP cukup banyak hingga bab ini, jadi kalau belum terlalu mengerti apa itu inheritance, jangan terlalu khawatir, yang penting sekarang pahami dahulu bagaimana hirarki class Exception.

Exception

Error

RuntimeException

Object

Seperti yang anda bisa lihat, hirarki kelas exception dimulai dari Object, kemudian ada class Throwable yang merupakan parent class dari semua jenis Exception. Ada dua buah class turunan langsung dari class Throwable yaitu class Error dan class Exception. Class Exception sendiri mempunyai satu turunan yaitu Runtime Exception.

Error biasanya tidak disebabkan karena kesalahan yang terjadi dalam aplikasi, tetapi lebih karena keadaan JVM yang tidak normal, misalnya error karena kehabisan memory. Error tidak perlu dihandle dalam try-catch karena tidak ada cara untuk mengatasi keadaan Error. Secara teknis sebenarnya error bukanlah exception karena bukan merupakan turunan dari Exception. Berbeda dengan Error, Exception merepresentasikan kesalahan yang terjadi dalam aplikasi. Kita bisa melakukan recovery untuk mengatasi Exception. JDK mempunyai banyak sekali class turunan dari Exception, nama class-class ini sangat descriptive sehingga hanya dengan melihat nama class Exceptionya kita sudah bisa menebak kesalahan apa yang terjadi dalam aplikasi. Class RuntimeException adalah class spesial yang disebut juga dengan unchecked exception. Nama unchecked exception digunakan karena RuntimeException tidak wajib dicatch. Contoh turunan dari RuntimeException adalah NullPointerException, ClassCastException, IndexOutOfBoundException dan masih banyak lagi.

Mari kita lohat contoh kode yang menyebabkan RuntimeException : public class RuntimeExceptionTest {

public static void main(String[] args){ int i = Integer.parseInt("abc");

System.out.println("kode setelah exception"); }

}

Kode di atas akan menyebabkan RuntimeException karena berusaha mengubah string "abc” menjadi angka. Perhatikan bahwa tidak wajib ada statement try-catch untuk menghandle RuntimeException. Tanpa ada try-catch dalam kode di atas, maka kalau terjadi exception kode akan segera keluar dari method, nah karena ini adalah method main dan tidak ada lagi method yang lain (ingat analogi call stack dengan gedung tinggi), aplikasi akan langsung keluar, dan string “kode setelah exception tidak akan ditampilkan”.

$ javac RuntimeExceptionTest.java $ java RuntimeExceptionTest

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Integer.parseInt(Integer.java:499) at RuntimeExceptionTest.main(RuntimeExceptionTest.java:3) $

Misalnya kita tidak yakin dengan String yang akan diubah menjadi integer berhasil atau tidak, kita bisa meletakkan statement try-catch, kalau ada error nilai integer kita set menjadi 0, lanjutkan program ke baris berikutnya, modifkasi kodenya seperti di bawah ini :

public class RuntimeExceptionTest { public static void main(String[] args){

int i = 0; try{ i = Integer.parseInt("abc"); } catch(NumberFormatException ex) { ex.printStackTrace(); }

System.out.println("kode setelah exception"); }

}

method parseInt, eksekusi akan meloncat ke dalam catch, mencetak stack trace ke console kemudian melanjutkan eksekusi untuk mencetak string “kode setelah exception” ke console. Dengan modifkasi di atas, kode menjadi lebih handal dan tidak menyebabkan program keluar sebelum eksekusi selesai semuanya.

$ javac RuntimeExceptionTest.java $ java RuntimeExceptionTest

java.lang.NumberFormatException: For input string: "abc" at

java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449)

at java.lang.Integer.parseInt(Integer.java:499)

at RuntimeExceptionTest.main(RuntimeExceptionTest.java:5) kode setelah exception

$

Class Exception yang bukan turunan dari RuntimeException disebut dengan checked exception. Kode yang didalamnya ada exception dengan tipe ini harus diletakkan dalam blok try, kalau tidak, maka akan terjadi kompilasi error. Sebagai contoh kita akan menulis kode untuk membuka fle, kode ini mengandung checked exception yaitu IOException. Pertama kita lihat dulu kode tanpa try, kode ini akan menyebabkan adanya kompilasi error :

import java.io.FileInputStream; public class CheckedExceptionTest {

public static void main(String[] args) {

FileInputStream inputStream = new FileInputStream("buka-file.txt"); System.out.println("kode setelah buka file");

} }

hasil kompilasi kode di atas adalah : $ javac CheckedExceptionTest.java

CheckedExceptionTest.java:4: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

FileInputStream inputStream = new FileInputStream("buka-file.txt"); ^

1 error $

terlihat pada output proses kompilasi di atas bahwa konstruktor new FileInputStream("buka-fle.txt"); melempar exception yang harus ditangkap (catch) atau dideklarasikan untuk dilempar (throw) lagi. Di bab ini kita baru belajar bagaimana menangkap exception, sedangkan bagaimana caranya melempar lagi exception kita bahas di bab berikutnya.

Untuk mengatasi error kompilasi di atas, kita akan menambahkan try-catch di kode di atas. import java.io.FileInputStream;

import java.io.FileNotFoundException; import java.io.IOException;

public class CheckedExceptionTest {

public static void main(String[] args) { try{

FileInputStream inputStream = new FileInputStream("buka-file.txt"); } catch(FileNotFoundException ex){

ex.printStackTrace(); } catch(IOException ex) { ex.printStackTrace(); }

System.out.println("kode setelah buka file"); }

Perhatikan bahwa konstruktor new FileInputStream("buka-fle.txt"); menyebabkan dua buah exception yaitu FileNotFoundException dan IOException. Kedua exception ini ditangkap dan dihandle dalam catch yang berbeda, kita bisa juga menangkap hanya IOException karena pada dasarnya FileNotFoundException adalah turunan IOException, sehingga cukup ditangkap sekali saja maka kedua tipe sudah dihandle. Contohnya seperti di bawah ini :

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;

public class CheckedExceptionTest {

public static void main(String[] args) { try{

FileInputStream inputStream = new FileInputStream("buka-file.txt"); } catch(IOException ex) {

ex.printStackTrace(); }

System.out.println("kode setelah buka file"); }

}

IOException dan FileNotFoundException adalah turunan Exception, sehingga bisa juga kita tangkap dengan tipe Exception, kalau ini yang kita lakukan maka semua class exception turunan dari Exception akan ikut ditangkap juga. Praktek “tangkap semua exception tanpa pandang bulu” seperti ini dikategorikan sebagai praktek kurang baik, karena semua jenis exception akan dihandle dengan cara yang sama, padahal kita bisa menghandle exception dengan lebih baik kalau bisa memilah-milah cara menghandle exception berdasar tipenya. Menangkap exception terbalik dengan menangkap koruptor, kalau koruptor harus ditangkap tanpa pandang bulu, sedangkan exception harus ditangkap dengan cara dipilah-pilah berdasarkan tipenya.

Dalam dokumen c2ed0 java desktop ifnu bima (Halaman 60-63)