Exception Handling Lanjutan
Prepared by Viska Mutiawani
1
[email protected]
Subtopik Exception handling lanjutan Assertion Exception handling: try-catch-finally Exception handling: try-with-resources statement Keyword throws Keyword throw Exception handling pada method overriding
2
[email protected]
Assertion
3
[email protected]
What is assertion? Assertion merupakan statement dalam bahasa Java yang dapat digunakan untuk menguji program berdasarkan asumsi-asumsi. Sewaktu eksekusi assertion, asumsi tersebut dipercaya benar.
Jika gagal, maka JVM akan melempar error bernama AssertionError.
Diperkenalkan pada Java versi ke 4.
4
[email protected]
Kegunaan assertion Berguna untuk mendeteksi dan mengoreksi error pemrograman. Assertion utamanya digunakan untuk tujuan pengujian.
5
[email protected]
Syntax assertion Ada 2 cara membuat assertion:
assert expression; assert expression1 : expression2;
Fitur assertion secara default dalam kondisi disable (tidak aktif). Jadi anda harus enable (aktifkan) dahulu. Caranya:
6
Gunakan, -ea or -enableassertions pada perintah java. Contoh sesudah mengkompil: javac AssertionExample.java Maka run dengan cara: java -ea AssertionExample
[email protected]
Contoh import java.util.Scanner; class AssertionExample{ public static void main( String args[] ){ Scanner scanner = new Scanner( System.in ); System.out.print("Enter ur age "); int value = scanner.nextInt(); assert value>=18:" Not valid"; System.out.println("value is "+value); } } Contoh hasil output: Output: Enter ur age 11 Exception in thread "main" java.lang.AssertionError: Not valid 7
[email protected]
Kondisi tidak menggunakan assertion Ada beberapa keadaan dimana anda sebaiknya tidak menggunakan assertion:
8
Diambil dari web Oracle, assertion sebaiknya tidak digunakan untuk mengecek argumen pada method public. Karena dapat menghasilkan runtime exception seperti: IllegalArgumentException, NullPointerException etc. Jangan gunakan assertion, jika anda tidak menginginkan error pada situasi apapun.
[email protected]
Exception handling: Try-catchfinally
9
[email protected]
What is exception?
Exception: kondisi abnormal Pada bahasa Java, exception merupakan suatu peristiwa yang mengganggu jalannya program secara normal. Berupa objek yang dilempar sewaktu runtime.
10
[email protected]
What is exception handling?
Merupakan mekanisme untuk menangani error runtime seperti ClassNotFound, IO, SQL, Remote etc. Kegunaannya:
11
Menjaga aliran normal dari program/aplikasi
[email protected]
Skenario
Andai ada statement seperti di bawah: statement 1; statement 2; statement 3; statement 4; statement 5;//exception occurs statement 6; statement 7; statement 8; statement 9; statement 10;
Jika exception muncul pada statement 5, maka statement 6-10 tidak akan dijalankan. Namun jika kita melakukan exception handling, maka statement 6-10 bisa dijalankan. 12
[email protected]
Hirarki class Exception
13
[email protected]
Tipe-tipe exception
Checked exception
Unchecked exception
Dicek saat kompilasi Class yang extendThrowable (kecuali RuntimeException dan Error) merupakan checked exception. Tidak dicek saat kompilasi, baru dicek saat runtime Class yang extend RuntimeException termasuk unchecked exception, seperti ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException
Error
14
Keadaan fatal yang terjadi Contoh: OutOfMemoryError, VirtualMachineError, AssertionError
[email protected]
Contoh skenario unchecked exception
Pembagian dengan 0. int a=50/0;
//ArithmeticException
Jika variabel menyimpan null, dan variabel tadi dipakai. String s=null; System.out.println(s.length());//NullPointerException
Kesalahan format number String s="abc"; int i=Integer.parseInt(s);//NumberFormatException
Memasukkan data ke dalam indeks yang salah pada array int a[]=new int[5]; a[10]=50; //ArrayIndexOutOfBoundsException 15
[email protected]
Exception handling dengan try-catchfinally
Salah satu cara untuk menghandle exception adalah dengan menggunakan blok try-catch-finally.
Try: berisi bagian yang akan menghasilkan exception Catch: jika exception muncul akan ditangkap dan dihandle Finally: akan selalu dilakukan walau tidak ada exception
Syntax: try{ //code that may throw exception } catch(Exception_class_Name ref){} finally{} 16
[email protected]
Contoh sederhana public class Testtrycatch2{ public static void main(String args[]){ try{ int data=50/0; }catch(ArithmeticException e){System.out.println(e);} System.out.println("rest of the code..."); } }
17
[email protected]
Multiple catch
Jika anda membuat coding untuk memproses sesuatu dan akan menghasilkan beberapa jenis exception, anda dapat menggunakan banyak catch sekaligus. Namun saat ada satu exception maka hanya akan ada satu catch yang paling sesuai yang digunakan. Multiple catch blok harus disusun dari yang paling spesifik hingga yang paling umum.
18
[email protected]
Mana yang betul? public class TestMultipleCatchBlock{ public static void main(String args[]){ try{ int a[]=new int[5]; a[5]=30/0; } catch(ArithmeticException e){ System.out.println("task1 is completed" );} catch(ArrayIndexOutOfBoundsExceptio n e){System.out.println("task 2 complet ed");} catch(Exception e){System.out.println("c ommon task completed");} System.out.println("rest of the code..."); } }
class TestMultipleCatchBlock1{ public static void main(String args[]){ try{ int a[]=new int[5]; a[5]=30/0; } catch(Exception e){ System.out.println("common task complete d");} catch(ArithmeticException e){ System.out.println("task1 is completed");} catch(ArrayIndexOutOfBoundsExceptio n e){System.out.println("task 2 completed" );} System.out.println("rest of the code..."); } }
19
[email protected]
Nested Try
Try juga bisa nested (berada di dalam try yang lain) bila diperlukan.
class Excep6{ public static void main(String args[]){ try{ try{ System.out.println("going to divide"); int b =39/0; }catch(ArithmeticException e){System.out.println(e);} try{ int a[]=new int[5]; a[5]=4; }catch(ArrayIndexOutOfBoundsException e){System.out.println(e);} System.out.println("other statement); }catch(Exception e){System.out.println("handeled");} System.out.println("normal flow.."); } }
20
[email protected]
Finally block
Digunakan untuk eksekusi code penting seperti tutup connection, tutup stream. Akan selalu dieksekusi saat exception dihandle atau tidak dihandle. Haruslah sesudah block try atau block catch.
21
[email protected]
Exception handling: try-withresources statement
22
[email protected]
Try-with-resources
Merupakan bentuk statemen try yang mendeklarasikan satu atau lebih sumber/resource. Resouce: merupakan objek yang harus ditutup setelah program selesai menggunakannya. Try-with-resource memastikan setiap resource yang dipakai akan ditutup setelah statemen resource selesai digunakan. Setiap objek yang mengimplement java.lang.AutoCloseable, java.io.Closeable, dapat menjadi resource.
23
[email protected]
Try-with-resources
Sebelum Java versi 7, untuk menutup resource (biasanya stream I/O, SQL connection) bisa menggunakan blok finally. Dengan menggunakan try-with-resource, method close() akan otomatis dipanggil sesudah resource selesai digunakan.
24
[email protected]
Bandingkan!
25
[email protected]
Bandingkan
26
[email protected]
Kondisi try-catch-finally
Anda harus mengecek apakah resource yang digunakan null sebelum menutupnya. Menutup resource juga dapat menghasilkan exception, sehingga harus dihandle dalam try-cathc juga. Programmer sering lupa untuk menutup resource.
27
[email protected]
Keyword throws
28
[email protected]
Keyword throws
Keyword throws digunakan untuk mendeklarasikan exception. Memberitahu bahwa coding akan menghasilkan exception dan menerima konsekuensi. Exception Handling dengan try-catch-finally dan trywith-resource biasanya digunakan untuk menghandle checked exceptions.
Unchecked exception lebih baik dipastikan tidak terjadi dengan membuat coding yang baik.
Error: beyond your control
29
Contoh: pembagian dengan 0 sebaiknya sebelum membagi, pastikan dulu bukan nilai 0. Seperti: VirtualMachineError or StackOverflowError.
[email protected]
Contoh
Syntax: return_type method_name() throws exception_class_name{ //method code }
Contoh: public void writeList() throws IOException { PrintWriter out = new PrintWriter(new FileWriter("Out.txt")); for (int i = 0; i < SIZE; i++) { out.println("Value at: " + i + " = " + list.get(i)); } Coding ini ada array, jadi ada kemungkinan out.close(); muncul unchecked exception IndexOutOfBoundsException. Namun unchecked } exception tidak harus dimasukkan dalam throws. 30
[email protected]
Keyword throw
31
[email protected]
Keyword throw
Keyword throw digunakan untuk melempar exception secara eksplisit. Kita dapat throw checked atau unchecked exception. Keyword throw biasanya digunakan untuk melempar custom exception. Syntax:
32
throw exception; throw new IOException("sorry device error);
[email protected]
Contoh public class TestThrow1{ static void validate(int age){ if(age<18) throw new ArithmeticException("not valid"); else System.out.println("welcome to vote"); } public static void main(String args[]){ validate(13); System.out.println("rest of the code..."); } } 33
[email protected]
throw vs throws
34
[email protected]
Custom exception
35
[email protected]
Custom exception
Merupakan Exception yang dibuat sendiri. Dengan menggunakan custom exception, anda dapat memiliki Exception buatan sendiri dan pesan yang anda dapat desain sendiri.
36
[email protected]
Contoh class InvalidAgeException extends Exception{ InvalidAgeException(String s){ super(s); } } class TestCustomException1{ static void validate(int age)throws InvalidAgeException{ if(age<18) throw new InvalidAgeException("not valid"); else System.out.println("welcome to vote"); } public static void main(String args[]){ try{ validate(13); }catch(Exception m){System.out.println("Exception occured: "+m);} System.out.println("rest of the code..."); } }
37
[email protected]
Exception propagation
38
[email protected]
Exception propagation/‘merambat’
Setiap method yang menghasilkan exception akan disimpan dalam stack. Isi stack pertama adalah tempat method dipanggil. Kemudian method berikutnya disimpan dalam stack, dst. Sehingga exception akan merambat sesuai dengan urutan pada stack dan bergantung pada bagian mana exception yang muncul dihandle. Namun defaultnya checked exception tidak dirambatkan.
39
[email protected]
Contoh class TestExceptionPropagation1{ void m(){ int data=50/0; } Pada contoh di atas, exception muncul void n(){ di m() namun tidak dihandle. Sehingga m(); merambat ke method n() namun } belum dihandle juga. Maka merambat void p(){ ke bawah lagi P() dimana exception try{ dihandle. n(); }catch(Exception e){System.out.println("exception handled");} } public static void main(String args[]){ TestExceptionPropagation1 obj=new TestExceptionPropagation1(); obj.p(); System.out.println("normal flow..."); } } 40
[email protected]
Exception handling pada overriding
41
[email protected]
Ada aturan exception handling pada method overriding
Jika method pada superclass tidak mendeklarasi exception
Method yang di-override pada subclass TIDAK boleh mendeklarasi checked exception, tapi boleh mendeklarasi unchecked exception.
Jika method pada superclass mendeklarasi exception
42
Method yang di-override pada subclass boleh mendeklarasi exception yang sama, subclass exceptionnya atau tidak ada exception. Namun tidak boleh mendeklarasi parent exception.
[email protected]
Contoh yg tidak boleh
43
[email protected]
Kegunaan exception
Memisahkan code untuk menangani error dengan code yang biasa Merambatkan error dalam stack Mengelompokkan dan membedakan tipe error
Read more: http://docs.oracle.com/javase/tutorial/essential/exceptions/advantages.html 44
[email protected]