Rabu, 07 November 2012

Pertemuan 5



OVERLOADING,OVERRIDING,DAN EXCEPTION

1.OVERLOADING
Merupakan Suatu Function yang memiliki parameter , dan function tersebut dapat memiliki nama function yang sama dengan yang lainnya dengan syarat jumlah parameter mesti berbeda atau bisa kita bilang Situasi di mana beberapa rutin dalam sebuah program dapat mempunyai nama sama tetapi berbeda jenis parameter dan/utau jenis return value.
lebih Jelasnya Overloading secara singkat :

·                Nama Method Boleh Sama , Tapi Jumlah Parameter Mesti berbeda
·                Nilai Yang Di Return Harus memiliki Tipe yang sama
 Contoh studi kasus :
public class Hitung
{   static int tambah(int x, int y)
    {   return x+y;
    }

    static double tambah(double x, double y)
    {   return x+y;
    }
   
    static int tambah(int x, int y, int z)
    {   return x+y+z;
    }
   
    static void tambah2(int x, int y)
    {   System.out.println("x"+x+" + y"+y+"="+(x+y));
    }

    public static void main(String[] a)
    {   int x,y;
        x=2;    y=x+3;
        x=tambah(2,3);
        System.out.println("1.    "+x);
        System.out.printf("2.   %.2f \n",tambah(2.3, 4.1));
        System.out.println("3.   "+tambah(5, 12, 3));
        System.out.println("4.   "+tambah(100, 0.5));
        System.out.println("5.   "+tambah(2.5, 4));
        System.out.println("6.   "+tambah(tambah(x*2, (x*2-y)), tambah((y-x),
                                                tambah(7, 3), 2)));
        System.exit(0);
    }
}

  • Overloading bisa juga diartikan dengan istilah sebagai berikut, metode dengan nama yang sama, parameter yang berbeda, me-return value dengan return type yang berbeda.
  • Dapat digunakan ketika operator yang sama memiliki implementasi yang berbeda.
Tujuan : memudahkan penggunaan/pemanggilan method dengan fungsionalitas yang mirip.Aturan Pendeklarasian Method Overloading yaitu:
  • Nama method harus sama
  • Daftar parameter harus berbeda
  • Return type boleh sama, juga boleh berbeda
Daftar Parameter Pada Overloading
Perbedaan daftar parameter bukan hanya terjadi pada perbedaan banyaknya parameter, tetapi juga urutan dari parameter tersebut.
Misalnya saja dua buah parameter berikut ini :
function_member(int x, String n)
function_member(String n, int x)
Dua parameter tersebut juga dianggap berbeda daftar parameternya.

Daftar Parameter Pada Overloading
Daftar parameter tidak terkait dengan penamaan variabel yang ada dalam parameter.
Misalnya saja 2 daftar parameter berikut :
function_member(int x)
function_member(int y)
Dua daftar parameter diatas dianggap sama karena yang berbeda hanya penamaan variabel parameternya saja.
Ciri-ciri Overloading:
1.Nama method harus sama
2.Daftar Parameter harus berbeda
3.Return type boleh sama boleh berbeda

Contoh Overloading dengan constructor:
#include 
class CRectangle {

int width, height;
public:
CRectangle ();
CRectangle (int,int);
int area (void) {return (width*height);}
};
CRectangle::CRectangle () {
width = 7;
height = 9;
}
CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}
int main () {
CRectangle rect (2,4);
CRectangle rectb;
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
}
OUTPUT>>
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCurcsi9lWKs0vz5BX-snM9QrusHAzYR0s_ZewQn65bvPJ6eT1TAHA6tTCuOpfGR6BMNGaXiYyabMH6mP54TFKdYF43H5PrMAcvv5KwiQ8BTXgbApnLNqYijtwF9aMWWU9Bx2uCZVOX5c/s320/overloading+JPg.JPG
2.OVERRIDING
 Merupakan Suatu Keadaan Dimana kelas anak dapat mengubah atau bisa kita bilang memodifikasi atau memperluas data dan method pada kelas induk.
Keuntungan Overriding : dapat menambahkan sifat / atribut pada kelas induk nya
lebih Jelasnya Overloading secara singkat :
·                Mendefinisikan method dengan nama sama pada class yang berbeda.
·                Konsep dapat di manfaatkan dalam beberapa kasus inheritance, di mana menginginkan penamaan method dengan nama sama namunberbeda dalam impelementasinya.

ciri - ciri overriding
1.Nama method harus sama
2.Daftar parameter harus sama
3.Return type harus sama
Contoh studi kasus :
class Kendaraan {
…………..
public String getJenis() {
System.out.println(“Harga BBM turun”);
}
}
class Motor extends Kendaraan {
…………..
public String getJenis() {
System.out.println(“Harga BBM premium 4000 rupiah”);
}
}

3.EXCEPTION
Merupakan Kesalahan atau error sering terjadi pada saat membuat program, ini yang membuat kesal para pemula programmer untuk itu menghindari dari kesalahan atau eror Java menyediakan fasilitas berupa mekanisme penanganan exception. Bisa di kata kan bahwa Exception adalah singkatan dari Exceptional Events atau dalam bahasa indonesianya kesalahan (error) yang terjadi pada saat pembuatan program dan saat runtime, mengakibatkan gangguan pada alur exekusi.
Kesalahan dalam program java terdapat beberapa tipe sebagai contoh kesalahan pembagian 0, mengakses elemen di luar jangkauan array dan input yang tidak benar. Exception merupakan sebuah subclasses baik secara langsung atau tidak langsung, sehingga exception di bagi 2 kategori class yaitu : Error Class dan Exception Class
Exception menunjukkan bahwa class tersebut dapat di terima oleh user program. Tetapi Exception class di gunakan untuk memperbaiki beberapa kesalahan pada kode program sebagai contoh Exception adalah pembagi oleh 0 dan error pada saat array melakukan tindakan di luar jangkauan. Error class menpunyai fungsi untuk menangani kesalahan atau error yang sering muncul pada saat program di jalankan. Tetapi kesalahan pada program merupakan di luar control user karena kemunculan di sebabkan oleh run-time environment. Sebagai contoh out of memory dan harddisk carsh.
 Dalam java dikenal adanya konsep method call stack. Bila ada method a() memanggil method b(), dan method b() memanggil method c(), maka method call stack dapat digambarkan sebagai berikut [1&2]:
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image001.gif
Method yang paling atas dari stack (method c() dalam hal ini) adalah method yang saat ini sedang dijalankan. Bila method c() telah selesai dijalankan, maka method call stack dapat digambarkan sebagai berikut [1&2]:
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image002.gif 
         Dalam java terdapat 2 jenis  object berdasarkan dapat dilempar atau tidaknya object itu dalam suatu method call stack , yaitu:
1.Object yang dapat dilempar dalam method call stack. Object ini adalah instansiasi dari kelas yang merupakan subclass dari java.lang.Throwable.
2.Object yang tidak dapat dilempar dalam method call stack.
Berikut ini adalah class diagram untuk menjelaskan hirarki dari kelas java.lang.Throwable :
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image003.gif
1)  Kelas-kelas turunan java.lang.Throwable biasanya menyatakan suatu kondisi yang tidak diharapkan selama eksekusi program [1].
2)  Object dari kelas-kelas turunan java.lang.Error biasanya dilemparkan untuk menyatakan adanya suatu kegagalan dalam JVM, seperti kehabisan memory (yang akan melemparkan object dari kelas  java.lang.outOfMemoryError ) [1&3] .
Biasanya program kita tidak dapat direcovery bila object dari subclass java.lang.Error dilemparkan [2&3].
Secara teknis, kelas-kelas turunan dari java.lang.Error tidak dapat disebut sebagai exception (karena mereka bukan subclass darijava.lang.Exception) [2].
3) Object dari kelas-kelas turunan java.lang.Exception biasanya dilemparkan untuk menyatakan suatu resource atau  suatu kondisi yang dibutuhkan oleh program tidak tersedia.
4) Object dari kelas-kelas turunan java.lang.RuntimeException biasanya dilemparkan untuk menyatakan adanya error dalam program. Contoh error dalam program adalah ketika kita berusaha mengakses suatu array dengan index yang lebih besar dari jumlah element-1 (yang akan melemparkan java.lang.ArrayIndexOutOfBoundsException).
Contoh:
Program 1

public class MyRuntimeException1 {
    public static void main(String[] args) {
        String[] myString = {"halo", "apa", "kabar"};
        System.out.println(myString[100]);
    }
}

Program di atas akan menghasilkan runtime error sbb :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
        at exception.MyRuntimeException1.main(MyRuntimeException1.java:6)

·         Berdasarkan dicek atau tidaknya suatu object yang dileparkan, throwable object terbagi menjadi 2, yaitu :
1.Checked throwable-object.
Checked throwable-object adalah throwable-object yang HARUS di “handle or declare” oleh programmer (pengertian “handle or declare” ada pada subbab 4: Checked exception).Kelas dan semua subclass dari java.lang.Throwable (kecuali kelas dan subkelas java.lang.Error dan java.lang.Runtime Exception nya adalah checked throwable-object.
2.Unchecked throwable-object
Unchecked throwable-object adalah throwable-object yang TIDAK HARUS di “handle or declare”.Semua kelas dan subclas dari java.lang.Error dan java.lang.RuntimeException adalah unchecked throwable-object. Pada referensi java, tidak ada yang disebut sebagai checked throwable-object dan unchecked throwable-object, yang ada adalah checked-exceptiondan unchecked-exception. Pada tulisan ini, checked throwable-object digunakan untuk menggantikan checked exception dan unchecked throwable-object dipergunakan untuk menggantikan unchecked exception, hal ini disebabkan karena pada referensi java lain, java.lang.Error termasuk pada unchecked exception, padahal java.lang.Error secara teknis adalah bukan exception.

KELAS java.lang.Throwable, BAGAIMANA MEMBUAT KELAS EXCEPTION BARU DAN BAGAIMANA MELEMPAR EXCEPTION SECARA MANUAL

Kelas java.lang.Throwable memiliki sebuah method yang sangat penting, yaitu printStackTrace(). Method ini berfungsi untuk mencetak stack trace dari tempat dimulainya exception terjadi (dari method paling baru yang dieksekusi sampai dengan method yang pertama kali dieksekusi).
Contoh :
Program 2
package exception;
public class MyThrowable1 {
    public static void main(String[] args) {
        try {
            System.out.println("Sebelum pelemparan " +
                    "object MyThrowableClass");
            new MyClass().e();
            System.out.println("Setelah pelemparan " +
                    "object MyThrowableClass");
  }
        catch(MyThrowableClass t) {
            System.out.println("Di dalam blok catch");
            t.printStackTrace();
        }
    }
}
class MyThrowableClass extends java.lang.Throwable {
    public MyThrowableClass() {
        super("Hallo, ini percobaan");
    }
}
class MyClass {
    void a() throws MyThrowableClass {
        throw new MyThrowableClass();
    }
    void b() throws MyThrowableClass {
        a();
    }
    void c() throws MyThrowableClass {
        b();
    }
    void d() throws MyThrowableClass {
        c();
    }
    void e() throws MyThrowableClass {
        d();
    }
}
Program di atas akan menghasilkan :
Sebelum pelemparan object MyThrowableClass
Di dalam blok catch
exception.MyThrowableClass: Hallo, ini percobaan
        at exception.MyClass.a(MyThrowable1.java:25)
        at exception.MyClass.b(MyThrowable1.java:28)
        at exception.MyClass.c(MyThrowable1.java:31)
        at exception.MyClass.d(MyThrowable1.java:34)
        at exception.MyClass.e(MyThrowable1.java:37)
        at exception.MyThrowable1.main(MyThrowable1.java:7)

·         Untuk membuat kelas exception baru, kita harus meng-extends kelas java.lang.Exception.
     Contoh :
Program 03
 class MyException extends java.lang.Exception {
   }

·         Keyword throw dapat dipergunakan untuk melempar object bertipe class atau subclass dari java.lang.Throwable.
Contoh :
Program 4
 public class MyThrow1 {
    private static void myThrow() throws Exception {
        throw new Exception();
    }
}

 KONSEP try-catch-finally

Ketika sebuah exception terjadi, maka kejadian tersebut dikatakan sebagai exception yang dilemparkan (thrown).
1. Kode yang bertanggung jawab untuk melakukan sesuatu ketika exception dilemparkan disebut dengan exception handler.
2.Ketika ada sebuah exception dilemparkan dan ada exception handler yang bertanggung jawab terhadap jenis exception tersebut, maka exception handler dikatakan menangkap (catch) exception.
3. Mekanisme exception adalah mentransfer eksekusi program dari tempat terjadinya exception ke exception handler yang sesuai.
4. try, catch, finally, throw, dan throws adalah keyword-keyword yang berhubungan dengan proses pelemparan object (instance dari subclassjava.lang.Throwable) [1]. Akan tetapi kita biasanya keyword-keyword tersebut hanya akan digunakan untuk instance dari subclassjava.lang.Exception saja [1&2].
5.Berikut ini adalah peta try-catch-finally [1] :
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image004.gif
Beberapa aturan yang berhubungan dengan peta try-catch-finally di atas adalah:
1) Harus ada blok try
2)  Blok try harus diikuti oleh 1 atau lebih blok catch dan atau 1 blok finally.
3) Blok try dapat hanya diikuti oleh blok catch saja, atau blok try dapat hanya diikuti oleh blok finally saja. Akan tetapi tidak boleh kedua-duanya (catch dan finally) tidak mengikuti blok try.
4)  Bila setelah blok try terdapat blok catch dan blok finally, maka blok finally harus terletak setelah blok catch.
5)  Antar blok try-catch-finally tidak boleh ada statement.
Berikut ini adalah contoh potongan program dengan blok try-catch-finally:
try {
     //Guarded region
}
catch(MyFirstException e) {
     //exception handler untuk object
//bertipe MyFirstException
}
catch(MySecondException e) {
//exception handler untuk object
//bertipe MySecondException
}
Finally {
     //Blok ini pasti dijalankan
}


·         Berikut ini adalah contoh program blok-try-catch :
Program 05
 package exception;
class ExceptionA extends Exception {}
class ExceptionB extends ExceptionA {}
class ExceptionC extends Exception {}
public class MyCatch1 {
    public static void main(String[] args) {
        System.out.println("Sebelum blok try");
        try {
            System.out.println("Statement sebelum exception");
            pelemparException();
            System.out.println("Statement setelah exception");
        }
        catch(ExceptionB eb) {
            System.out.println("Dalam blok catch(ExceptionB eb)");
        }
        catch(ExceptionA ea) {
            System.out.println("Dalam blok catch(ExceptionA ea)");
        }
        catch(ExceptionC ec) {
            System.out.println("Dalam blok catch(ExceptionC ec)");
        }
        finally {
            System.out.println("Dalam blok finally");
        }
        System.out.println("Setelah blok try");
    }
    public static void pelemparException()
    throws ExceptionA, ExceptionB, ExceptionC {
        throw new ExceptionA();
    }
}
Program di atas akan menghasilkan :
Sebelum blok try
Statement sebelum exception
Dalam blok catch(ExceptionA ea)
Dalam blok finally
Setelah blok try






·         Skenario umumdari blok try-catch-finally
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image005.jpg

·         Ketika suatu exception terjadi dan tidak ada catch yang sesuai untuk menangkap exception itu dalam suatu method, maka exception tersebut akan dilempar ke method pemanggil method saat ini (hal ini disebut dengan exception propagation) [1&2]. Hal ini akan terjadi terus sampai akhirnya bila semua method dalam method call stack tidak ada yang bisa menangkap exception tersebut, maka exception tersebut akan dilemparkan ke JVM dam akhirnya program akan berhenti karena exception [1].
Contoh :
Program 6
 package exception;
 public class MyException1 {
    public static void main(String[] args) {
        Percobaan obj = new Percobaan();
        obj.a();
    }
}
 class Percobaan {
   void d() {
        System.out.println("Dalam method d(). " +
                "Sebelum operasi pembagian.");
        int i = 2 / 0; //Pasti terjadi exception
        System.out.println("Dalam method d(). " +
                "Setelah operasi pembagian.");
    }  
    void c() {
        System.out.println("Dalam method c(). " +
                "Sebelum pemanggilan method lain.");
        d();
        System.out.println("Dalam method c(). " +
                "Setelah pemanggilan method lain.");
    }
   void b() {
        System.out.println("Dalam method b(). " +
                "Sebelum pemanggilan method lain.");
        c();
        System.out.println("Dalam method b(). " +
                "Setelah pemanggilan method lain.");
    }
    void a() {
        System.out.println("Dalam method a(). " +
                "Sebelum pemanggilan method lain.");
        b();
        System.out.println("Dalam method a(). " +
                "Setelah pemanggilan method lain.");
    }
}
Program di atas akan menghasilkan :
Dalam method a(). Sebelum pemanggilan method lain.
Dalam method b(). Sebelum pemanggilan method lain.
Dalam method c(). Sebelum pemanggilan method lain.
Dalam method d(). Sebelum operasi pembagian.
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at exception.Percobaan.d(MyException1.java:14)
        at exception.Percobaan.c(MyException1.java:22)
        at exception.Percobaan.b(MyException1.java:30)
        at exception.Percobaan.a(MyException1.java:38)
        at exception.MyException1.main(MyException1.java:6)

TRY

1.try dipergunakan untuk menempatkan blok kode dimana ada kemungkinan exception terjadi dalam blok tersebut.
2.Bila exception terjadi dalam baris x dari blok try, maka baris x+1 tidak akan dijalankan
Contoh :

  1. ......
  2. try {
  3.       statement1;
  4.       statement2;
  5.       statement3;
  6. }
  7. catch(ExceptionType e) {
  8.        //.....
  9. }
  10. .....

Bila exception terjadi pada baris ke 4 (statement2), maka baris ke 5 tidak akan dijalankan.
·    Bila dalam blok try tidak terjadi exception, kontrol program akan meloncat ke blok finally (bila ada blok finally), dan kemudian kontrol program akan meloncat ke statement setelah blok try-catch-finally [1&2].
Contoh:

1.     ......
2.     try {
3.           statement1;
4.           statement2;
5.           statement3;
6.     }
7.     catch (ExceptionA ea) {
8.        ......
9.        ......
10.}
11.catch (ExceptionB eb) {
12.      ......
13.      ......
14.}
15.finally {
16.      .....
17.      .....
18.}
19.......

Bila dalam blok try tidak terdapat exception (baris 5 sukses dijalankan), maka kontrol program akan meloncat ke baris 16 dan 17 (bila terdapat blokfinally), dan kemudian kontrol program meloncat ke baris 19.

CATCH

·    Blok catch yang mengikuti blok try adalah bersifat optional (bila setelah blok try tidak terdapat blok catch, maka setelah blok try harus terdapat blokfinally).
·    Sebuah blok try dapat diikuti oleh 1 atau lebih blok catch.
·     Bila ada exception P dalam blok try, maka hanya blok catch yang bertanggung jawab untuk menghandle exception P tersebut yang akan dijalankan. Bila ternyata tidak ada blok catch yang diperuntukkan menangkap exception P, maka exception akan dilempar ke method pamanggil method ini.
Contoh: Lihat program 05 di atas J
·    Blok catch yang diperuntukkan menangkap ExceptionA dapat pula menangkap exception bertipe subclass dari Exception.
Contoh, bila terdapat pohon inheritance dari exception sbb:
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image006.gif
Maka :
Blok catch
Jenis exception yang dapat ditangkap
 catch(ExceptionB eb) {/*..*/}

 ExceptionB
 catch(ExceptionA ea) {/*..*/}

 ExceptionB dan ExceptionA

catch(Exception e) {/*..*/}


ExceptionB, ExceptionA, danjava.lang.Exception



·         Bila blok catch terdapat lebih dari 1, maka urutan penempatan blok catch harus memenuhi aturan sebagai berikut .
1.      Bila dalam blok-blok catch tersebut terdapat 2 atau lebih exception yang terletak dalam sebuah pohon inheritance, maka blok catch pertama untuk pohon inheritance tersebut adalah blok catch untuk menangkap jenis exception yang paling khusus (exception yang terletak paling bawah dalam pohon inheritance).
2.      Bila blok-blok catch menangkap exception yang saling ”sibling”(tidak terletak dalam 1 pohon inheritance), maka urutan penempatan blok catch tidak menjadi masalah.
Contoh, bila terdapat pohon inheritance sbb [1]:
http://catatan.desdrianton.net/scjp/content/EXCEPTION_files/image007.gif

PENEMPATAN URUTAN BLOK CATCH YANG VALID
PENEMPATAN URUTAN BLOK CATCH YANG TIDAK VALID

catch(ExceptionB eb) {/*...*/}
catch(ExceptionA ea) {/*...*/}
catch(ExceptionC ec) {/*...*/}

catch(ExceptionA ea) {/*...*/}
catch(ExceptionB eb) {/*...*/}
catch(ExceptionC ec) {/*...*/}


catch(ExceptionC ec) {/*...*/}
catch(ExceptionB eb) {/*...*/}
catch(ExceptionA ea) {/*...*/}


catch(ExceptionC ec) {/*...*/}
catch(ExceptionA ea) {/*...*/}
catch(ExceptionB eb) {/*...*/}

catch(ExceptionB eb) {/*...*/}
catch(ExceptionC ec) {/*...*/}
catch(ExceptionA ea) {/*...*/}


catch(ExceptionA ea) {/*...*/}
catch(ExceptionC ec) {/*...*/}
catch(ExceptionB eb) {/*...*/}

Bila penempatan urutan catch tidak valid, maka program tidak dapat dicompile (compile time error).
Contoh:
Program 07

class ExceptionA extends Exception {}

public class MyCatch3 {
    private void throwException() throws ExceptionA {
        throw new ExceptionA();
    }
   
    public static void main(String[] args) {
        MyCatch3 obj = new MyCatch3();
       
        try {
            obj.throwException();
        }
        catch(Exception e) {}
        catch(ExceptionA ea) {}
    }
}
Program di atas akan menghasilkan compile time error sbb :
E:\Data\Data NetBeans\scjp\src\exception\MyCatch3.java:17: exception exception.ExceptionA has already been caught
        catch(ExceptionA ea) {}
1 error

·    Bila exception yang terjadi dalam blok try tidak dapat ditangkap oleh satupun blok catch yang ada, maka exception akan dilempar ke method pemanggil method saat ini (yang sesuai dengan method call stack).
·    Bila dirangkum tentang semua mekanisme catch di atas, maka semua mekanisme itu disebut dengan excpetion matching : ”Bila dalam blok try terjadi exception, maka akan dicari blok catch yang dikhususkan menangkap exception tersebut. Bila tidak ada, maka dicari blok catch yang dapat menangkap superclass dari exception tersebut. Bila tetap tidak ada, maka exception akan dilempar ke method pamanggil method saat ini”.

FINALLY

·     Blok try dapat diikuti oleh maksimal 1 buah blok finally (bila setelah blok try tidak terdapat blok finally, maka setelah blok try harus terdapat minimal 1 buah blok catch) [1].
·     Blok finally harus terletak setelah blok-blok catch(bila ada), atau langsung mengikuti blok try (bila blok catch tidak ada) [1].
·     Blok finally pasti dijalankan, baik apabila pada blok try terdapat exception ataupun tidak [1].
·    Biasanya blok finally berisi statement-statement untuk cleanup resource [1&2].
·    Skenario umum yang melibatkan blok finally:
1.  Bila dalam blok try tidak terdapat exception, maka setelah blok try selesai dieksekusi, control flow akan meloncat ke blok finally , dan blokfinally tersebut akan dijalankan. Setelah blok finally dijalankan, control flow akan meloncat ke statement setelah blok finally.
2.  Bila dalam blok try terdapat exception, maka control flow program akan meloncat ke blok catch yang sesuai dengan exception tersebut (bila ada), setelah blok catch selesai dijalankan, control flow akan meloncat ke blok finally. Setelah blok finally dijalankan, control flow akan meloncat ke statement setelah blok finally.
3.  Bila dalam blok try terdapat exception, dan tidak terdapat catch yang sesuai untuk exception tersebut, maka control flow akan meloncat ke blokfinally, setelah blok finally selesai dijalankan, flow control akan meloncat lagi ke method pemanggil method saat ini. Bila dalam blok try terdapat statement return, blok finally tetap akan dijalan. Blok finally ini akan dijalankan tepat setelah statement returndijalankan, dan sebelum return mengembalikan nilai [1&2].
Contoh.
Program 08
 public class MyReturn1 {
   public static void main(String[] args) {
        MyReturn1 obj = new MyReturn1();
        System.out.println("sebelum pemanggilan method a()");
        obj.a();
        System.out.println("setelah pemanggilan method a()");
    }
    public int a() {
        try {
            System.out.println("di dalam blok try");
            return b(); //method b() adalah statement return.
        } finally {
            System.out.println("di dalam blok finally");
        }
    }
   public int b() {
        System.out.println("di dalam method b()");
        return 1;
    }
}
Program di atas akan menghasilkan :
sebelum pemanggilan method a()
di dalam blok try
di dalam method b()
di dalam blok finally
setelah pemanggilan method a()

Pengertian ”Blok finally ini akan dijalankan tepat setelah statement return dijalankan, dan sebelum return mengembalikan nilai” mungkin agak membingungkan. Dari contoh program di atas, method b() adalah statement return (blok finally akan dijalankan setelah statement returndijalankan). Sedangkan pengertian “return mengembalikan nilai” adalah saat return mengembalikan nilai 1 hasil dari statement returnBila dalam blok catch yang sesuai dengan exception terdapat keyword throw, blok finally tetap akan dijalan. Blok finally ini akan dijalankan tepat sebelum keyword throw melemparkan exception.




Contoh:



Program 9
public class MyFinally1 {
    private static void pelemparException1()
    throws Exception {
        throw new Exception();
    }
  private static void pelemparException2()
    throws Exception {
        try {
            pelemparException1();
        }
        catch(Exception e) {
            System.out.println("Dalam blok catch " +
                    "method pelemparException2()");
            throw e;
        }
        finally {
            System.out.println("Dalam blok finally " +
                    "method pelemparException2()");
        }
    }
   
    public static void main(String[] args) {
        try {
            pelemparException2();
        }
        catch(Exception e) {}
    }
}
Program di atas akan menghasilkan :
Dalam blok catch method pelemparException2()
Dalam blok finally method pelemparException2()

CHECKED EXCEPTION

 Yang termasuk checked exception adalah class java.lang.Throwable dan semua subclassnya, kecuali class dan subclass dari java.lang.Error danjava.lang.RuntimeErrorBila terdapat checked exception, maka checked exception tersebut harus di handle or declare [2]. Pengertian di handle adalah terdapat blok catchyang sesuai dengan exception. [1] Pengertian di declare adalah meletakkan daftar exception yang mungkin dilemparkan dari suatu method (dengan keywordthrows).
Perhatikan contoh berikut:
Program 9
public class Coba1 {
      public static void myMethod()
            throws MyException, MyException2 {}

      public static void myMethod2() {
            try {
                  myMethod();
            }
            catch(MyException e) {}
      }
}
class MyException extends Exception {}
class MyException2 extends Exception {}
Bila dicompile, program tersebut akan menghasilkan error sbb:
E:\Data\Data NetBeans\scjp\src\exception\Coba1.java:7: unreported exception exception.MyException2; must be caught or declared to be thrown
            myMethod();
1 error
Compile time error di atas terjadi karena myMethod() memiliki kemungkinan melemparkan exception MyException dan MyException2. Akan tetapi, dalam method myMethod2() yang memanggil myMethod() hanya memperhatikan exception MyException (myException2 tidak diperhatikan, dan menimbulkan compile time error). Hal ini dapat diperbaiki dengan salah satu dari 2 cara berikut:
1.      Meng-catch exception MyException2
2.      Mendeklarasikan bahwa method myMethod2() dapat melempar exception MyException2.
Program 10 (cara 1)
public class Coba1 {
    public static void myMethod()
        throws MyException, MyException2 {}
    public static void myMethod2() {
        try {
            myMethod();
        }
        catch(MyException e) {}
        catch(MyException2 e) {}
    }
}
class MyException extends Exception {}
class MyException2 extends Exception {}

Program x10(cara 2)
public class Coba1 {
    public static void myMethod()
        throws MyException, MyException2 {}
      public static void myMethod2() throws MyException2 {
        try {
            myMethod();
        } catch(MyException e) {}
    }
}
class MyException extends Exception {}
class MyException2 extends Exception {}

·         Suatu method yang memiliki keyword throws dalam deklarasi methodnya, maka method itu memiliki kemungkinan untuk melempar jenis-jenis exception yang ada setelah keyword throws. Pengertian kemungkinan disini adalah mungkin melempar atau mungkin tidak melempar exception, jadi tidak selalu method dengan keyword throws pasti melempar exception [1&2].

 UNCHECKED EXCEPTION

·         Unchecked exception adalah exception yang tidak perlu diperhatikan oleh programmer (tidak akan menimbulkan compile time error bila tidak diperhatikan).
Yang termasuk unchecked exception adalah kelas-kelas berikut :
1.      java.lang.Error dan subclassnya
2.      java.lang.RuntimeException dan subclassnya.
·         Unchecked exception tidak perlu di handle (catch) or declare (throws). Akan tetapi bila kita ingin menghandle ataupun mengdeclarenya tidak masalah.
Program 11
package exception;
public class Coba2 {
    public static void lemparException()
        throws MyRuntimeException {
throw new MyRuntimeException();
     }
   
    //tanpa handle dan tanpa declare
    public static void myMethod1() {
        lemparException();
    }
    //dengan handle dan tanpa declare
    public static void myMethod2() {
        try {
            lemparException();
        }
        catch(MyRuntimeException e) {}
    }
    //tanpa handle dan dengan declare
    public static void myMethod3() throws RuntimeException {
        lemparException();
    }
}
class MyRuntimeException extends RuntimeException {}


COMMONS EXCEPTIONS AND ERRORS

·    Subbab ini membahas exception dan errrors yang sering keluar dalam ujian SCJP 1.5.
·    Berikut ini adalah class diagram dari kelas-kelas Exception dan Error yang sering keluar dalam ujian SCJP 1.5 [1]. Kelas-kelas yang diarsir adalah yang sering keluar. Sebagai catatan, semua kelas dibawah ini terletak pada package java.lang



Tidak ada komentar:

Posting Komentar