Kategori-Kategori Exception:
-Checked exceptions: merupakan exception yang disebabkan
oleh kesalahan
pemakai program atau hal lain yang
dapat diprediksi oleh pemrogram. Contohnya,
jika ingin membuka file tapi file tidak
ditemukan, maka exception akan muncul.
-Runtime exception: ini adalah exception yang muncul dimana
kemunculannya
tidak bisa dihindari oleh pemrogram.
-Errors: Ini sebenarnya bukan exception, namun
merupakan masalah yang muncul
diluar kendali pemakai dan pemrogram.
Error secara umum akan dibiarkan saja,
sebab tidak ada yang bisa dilakukan
untuk mengatasinya. Sebagai contoh, jika stack
overflow muncul, maka error akan
muncul.
Hierarki Exception:
Semua class exception adalaha subclass
dari class java.lang.Exception. Class
Exception sendiri merupakan subclass
dari class Throwable. Selain class exception,
ada juga class Error yang juga
diturunkan dari class Throwable.
Normalnya, Error jarang dibuat
objectnya pada java. Kondisi ini bisa muncul jika ada
masalah parah yang tidak dapat ditangani
oleh program java. Contoh: JVM kehabisan
memori. Untuk kasus ini program tidak
akan dapat menangani error yang terjadi.
Class Exception memiliki dua subclass
utama: IOException dan RuntimeException.
Method-method di class exception:
public String getMessage()
mengembalikan detail informasi mengenai
exception yang terjadi.Informasi ini
diinisialisasi oleh constructor milik
Throwable
public Throwable getCause()
menampilkan penyebab dari exception
public String toString()
mendapatkan nama exception ditambah
informasinya
public void printStackTrace()
menampilkan hasil toString() beserta
stack trace System.err
public StackTraceElement[]
getStackTrace()
mengembalikan array yang berisi semua
elemen di stack trace. Elemen ke 0
mewakili bagian atas call stack, dan
elemen akhir array mewakili bagian akhir
call stack
public Throwable
fillInStackTrace()
mengisi stack trace dari object
Throwable dengan stack trace yang terdeteksi,
menambah ke dalam stack trace
Menangkap Exception:
Method menangkap exception menggunakan
kombinasi try dan catch keywords.
Kode program yang dapat menimbulkan
exception diletakkan di dalam blok try .
Sintaks penggunaan try-catch adalah
sebagaimana berikut:
try
{
//Protected code
}catch(ExceptionName e1)
{
//Blok Catch
}
Statement catch disertai dengan
deklarasi tipe exception yang ingin ditangani. Jika
exception terjadi di bagian protected
code, maka blok catch akan melakukan
pemeriksaan. Jika tipe exceptionnya ada
di dalam blok catch, maka exception yang
bersangkutan akan ditangani
Contoh:
Berikut adalah array dua dimensi.
Kemudian program akan mengakses elemen ke 3
dari array tersebut, sehingga
mengakibatkan exception
// File Name :
ExcepTest.java
import java.io.*;
public class ExcepTest{
public static void main(String args[]){
try{
int a[] = new int[2];
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
System.out.println("Out of the block");
}
}
Program diatas akan menghasilkan:
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block
Multiple blok catch:
Blok
try dapat diikuti oleh banyak blok catch. Sintaks untuk multiple blok catch
adalah:
try
{
//Protected code
}catch(ExceptionType1 e1)
{
//Catch block
}catch(ExceptionType2 e2)
{
//Catch block
}catch(ExceptionType3 e3)
{
//Catch block
}
Kode di atas menunjukkan tiga blok
catch, namun anda dapat memiliki berapapun
setelah try. Jika exception terjadi di
bagian protected code, maka exception akan
dilemparkan, kemudian diperiksa oleh
blok catch pertama. Jika tipe exception-nya
sesuai, maka akan ditangkap oleh blok
pertama ini. Jika tidak, maka akan diperiksa
oleh blok catch kedua. Hal ini akan
dilanjutkan hingga ada blok catch yang sesuai.
Jika tidak ada yang sesuai, maka method
akan menghentikan eksekusinya dan
melempar exception tadi ke method
pemanggilnya sesuai urutan call stack.
Contoh:
Berikut adalah penggalan program yang
menunjukkan penggunaan multiple try
try
{
file = new FileInputStream(fileName);
x = (byte) file.read();
}catch(IOException i)
{
i.printStackTrace();
return -1;
}catch(FileNotFoundException f) //Not valid!
{
f.printStackTrace();
return -1;
}
Keyword throws dan throw
Jika method tidak dapat menangani
exception, maka method tersebut harus
mendeklarasikan jenis exception yang
mungkin dilemparkan menggunakan kata
throws. Kata throws digunakan pada bagian
deklarasi method.
Anda dapat melempar exception, atau
object exception baru, atau exception yang baru
saja ditangkap; dengan menggunakan kata
throw. Coba untuk memahami perbedaan
throws dan throw.
Berikut adalah sebuah method yang
melemparkan RemoteException
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
Pada suatu method dapt didefinisikan
lebih dari satu macam keluaran exception yang
dipisahkan dengan tanda koma (,).
Sebagai contoh: method berikut kemungkinan
melemparkan RemoteException dan
InsufficientFundsException:
import java.io.*;
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
Keyword finally:
Keyword finally digunakan untuk membuat
blok yang mengikuti blok try. Blok
finally selalu dieksekusi, tidak peduli
exception terjadi atau tidak.
Menggunakan keyword finally
memungkinkan untuk menjalankan langkah akhir ysng
harus dijalankan tidak peduli pada apa
yang terjadi di bagian protected code.
Blok finally berada di bawah catch blok
dan memiliki sintaks sebagaimana berikut:
try
{
//Protected code
}catch(ExceptionType1 e1)
{
//Catch block
}catch(ExceptionType2 e2)
{
//Catch block
}catch(ExceptionType3 e3)
{
//Catch block
}finally
{
//The finally block always executes.
}
Contoh:
public class ExcepTest{
public static void main(String args[]){
int a[] = new int[2];
try{
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
finally{
a[0] = 6;
System.out.println("First element value: " +a[0]);
System.out.println("The finally statement is
executed");
}
}
}
Hasil dari program ini adalah:
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed
Perhatikan hal berikut ini:
1.Blok catch tidak dapat dibuat tanpa adanya blok try
2.Tidak wajib membuat blok finally bila blok try-catch sudah
ada
3.Blok try tidak dapat dibuat tanpa ada blok catch atau blok
finally
Keuntungan Menggunakan Exception
Keuntungan 1: Memisahkan kode
Error-Handling dari kode utama
Dengan fasilitas pemisahan kode utama
dan kode error handling, memungkinkan
bagi kita untuk berkonsentrasi terhadap
bagian bagian tersebut. Di pemrograman
tradisional, deteksi error, reporting,
dan penanganan error menimbulkan
kompleksitas program semakin tinggi.
Sebagai contoh, perhatikan pseudo code
berikut ini:
bacaFile {
buka file;
dapatkan ukuran file;
alokasikan memori sebesar ukuran
file;
salin isi file ke memori;
tutup file;
}
Program diatas secara sekilas dapat digunakan
untuk menyalin file ke memori.
Namun ada beberapa hal yang tidak diperhatikan,
yakni:
- Apa yang terjadi bila file tidak dapat dibuka?
- Apa yang terjadi bila ukuran file tidak dapat ditentukan?
- Apa yang terjadi bila memori yang dipesan tidak mencukupi?
- Apa yang terjadi jika proses penyalinan gagal?
- Apa yang terjadi jika file tidak dapat ditutup?
Untuk menangani kemungkinan di atas,
fungsi bacaFile
harus dilengkapi dengan
kemampuan deteksi error, reporting dan
penanganan error. Berikut adalah
pengembangan dari fugsi tersebut:
errorCodeType bacaFile
{
initialize errorCode = 0;
buka file;
if (fileTerbuka) {
dapatkan ukuran file;
if (ukuranDidapatkan) {
alokasi memori sebesar ukuran file;
if (alokasiBerhasil) {
salin isi file ke memori;
if (salinFile) {
errorCode = -1;
}
} else {
errorCode = -2;
}
} else {
errorCode = -3;
}
tutup file;
if (fileTidakTertutup
&& errorCode == 0) {
errorCode = -4;
} else {
errorCode = errorCode and -4;
}
} else {
errorCode = -5;
}
return errorCode;
}
Jika dilihat kembali, pseuso code di atas
terlalu didominasi oleh deteksi error,
reporting dan penanganan error; sedangkan
lima bagian utama dari fungsi jadi
sulit dikenali. Lebih buruk lagi, logical
flow dari fungsi juga tidak dapat dikenali,
sehingga menyusahkan untuk memastikan apakah
program dapat mengatasi
semua kejadian dengan benar: Apakah file akan
ditutup bila fungsi gagal untuk
mengalokasikan memori dengan benar? Dan
menjadi lebih sulit lagi jika kita
ingin mengubah fungsi tiga bulan kemudian.
Banyak programmer yang
mengabaikan saja masalah ini, dan baru
bertindak jika program crash.
Exception memungkinkan kita untuk menulis
alur logika program utama dan
menangani kasus khusus di tempat lain. Jika
bacaFile menggunakan exception,
maka code fungsi akan seperti ini.
bacaFile {
try {
buka file;
dapatkan ukuran file;
alokasikan memori sebesar ukuran
file;
salin isi file ke memori;
tutup file;
} catch (fileOpenFailed) {
lakukanSesuatu;
} catch (sizeDeterminationFailed) {
lakukanSesuatu;
} catch (memoryAllocationFailed) {
lakukanSesuatu;
} catch (readFailed) {
lakukanSesuatu;
} catch (fileCloseFailed) {
lakukanSesuatu;
}
}
Dengan adanya exception, code menjadi
terorganisasi, sehingga kerja kita
menjadi semakin efisien.
Keuntungan 2: Propagasi errors berdasarkan
Call Stack
Keuntungan kedua exception adalah adanya
mekanisme propagasi laporan error
melalui method-method di call stack. Misalkan
bacaFile merupakan method ke 4
yang dipanggil sebagai secara berurutan
sampai main program: method1
memanggil method2, method2
memanggil method3, dan method3
memanggil bacaFile.
method1 {
call method2;
}
method2 {
call method3;
}
method3 {
call bacaFile;
}
Misalkan method1 merupakan satu-satunya
method yang dapat menangani error
di bacaFile(). Pada sistem notifikasi error
secara tradisional, maka bacaFile,
method3 dan method2 hars mengirimkan return
value berupa kode error. Hasilnya
adalah seperti kode di bawah ini:
method1 {
errorCodeType error;
error = call
method2;
if (error)
doErrorProcessing;
else
proceed;
}
errorCodeType method2
{
errorCodeType error;
error = call method3;
if (error)
return error;
else
proceed;
}
errorCodeType method3
{
errorCodeType error;
error = call
readFile;
if (error)
return error;
else
proceed;
}
Dengan kasus yang sama, Java runtime
environment bisa mencari secara terbalik
ke call stack untuk mencari exception
handling yang sesuai. Sehingga, kode di
atas akan menjadi:
method1 {
try {
call method2;
} catch (exception
e) {
doErrorProcessing;
}
}
method2 throws
exception {
call method3;
}
method3 throws
exception {
call readFile;
}
Namun, sebagaimana diperlihatkan pada kode di
atas, untuk keperluan ini
digunakan keywords throws.
Keuntungan 3: Pengelompokan dan Pembedaan Tipe
Error
Karena semua exception yang dilempar adalah
object, pengelompokan dan
kategorisasi exception dapat dilakukan
menurut hierarki class. Contoh
pengelompokan berdasar hierarki class
tersebut dapat dilihat di java.io
--
IOException dan turunannya. IOException adalah class exception yang paling
umum untuk menangani error input dan output.
Turunan class ini diperuntukkan
bagi jenis error yang lebih spesifik. Sebagai
contoh, FileNotFoundException
menandakan bahwa file tidak ditemukan di
disk.
Di method dapat ditulis suatu handler untuk
menangani masalah yang sangat
spesifik. FileNotFoundException tidak
memiliki turunan, sehingga memang
peruntukannya sangat spesifik.
catch (FileNotFoundException e) {
...
}
Method dapat menangkap exception berdasarkan
kelompoknya atau berdasarkan
kriteria yang lebih umum dengan
menspesifikansikan tipe class exception yang
lebih umum. Sebagai contoh, untuk menangkap
semua jenis masalah input dan
output gunakan kode berikut ini:
catch (IOException e) {
...
}
Handler ini akan menangkap semua exception
bertipe I/O, termasuk
FileNotFoundException, EOFException dan
lainnya. Bahkan kita dapat menulis
kode untuk menangkap semua jenis exception,
sebagaimana berikut ini:
catch (Exception e) {
...
}
Nama : Guntur Putra Adji
WIdya Ningkrat
NIM : 13622029
Kelas : A - Sore
No comments:
Post a Comment