EXCEPTION HANDLING

Download Report

Transcript EXCEPTION HANDLING

EXCEPTION HANDLING
Definisi
 Exception merupakan sebuah mekanisme
yang digunakan oleh bahasa pemrograman
komputer untuk mendeskripsikan apa yang
harus dilakukan ketika sesuatu yang tidak
dikehendaki terjadi. Sesuatu yang tidak
dikehendaki ini biasanya dalam bentuk error,
seperti pemanggilan method dengan
arguman yang tidak valid, kegagalan koneksi
dalam sebuah jaringan, atau usaha untuk
membuka sebuah file yang tidak ada.

Perhatikan contoh kode berikut ini:
public class HaloDunia{
public static void main(String[] args) {
int i = 0;
String salam[] = {
“Halo Dunia!",
“Apa Kabar!",
“Dahsyat!"
};
while(i < 4) {
System.out.println(salam[i]);
i++;
}
}
}
 Jika kode di atas tidak menangani exception,
maka program akan berhenti dengan sebuah
pesan kesalahan.
java HaloDunia
Halo Dunia!
Apa Kabar!
Dahsyat!
java.Lang.ArrayIndexOutOfBoundsException:
at HaloDunia.main(HelloWorld.java:12)
 Contoh lain program yang dapat
menimbulkan exception
class ContohEksepsi2 {
public static void main(String[] args) {
int pembilang = 2;
int penyebut = 0;
int hasil = pembilang/penyebut; // SALAH
System.out.println("Hasil = " + hasil);
}
}
 Pada gambar berikut ini ditunjukkan hirarki kelas yang
ada di dalam kelas-kelas yang tergabung dalam
exception.
StackOverflowError
VirtualMachineError
--OutOfMemoryError
Error
---
AWTError
ArithmeticException
Throwable
--RuntimeException
NullPointerException
Exception
IndexOutOfBoundsException
---
EOFException
IOException
--FileNotFoundException
 Kelas java.lang.Throwable merupakan kelas induk dari
semua obyek yang dapat dilemparkan dan di-catch menggunakan
mekanisme penanganan exception.
Tiga subclass penting dari kelas Throwable, yaitu kelas Error,
RuntimeException, dan Exception:
-Error. Mengindikasikan problem yang fatal yang sulit ditangani.
Contoh: out of memory. Program tidak perlu menangani kondisi yang
demikian.
-RuntimeException. Exception ini mengindikasikan kondisi yang
seharusnya tidak terjadi jika program berjalan dengan normal.
-Exception yang lain, mengindikasikan permasalahan yang
muncul pada saat runtime yang biasanya disebabkan oleh hal-hal
yang berkaitan dengan lingkungan di mana program berjalan dan
exception jenis ini dapat ditangani.
Exception yang sering
Terjadi
- ArithmeticException – terjadi ketika
program melakukan operasi pembagian
dengan nol pada bilangan integer.
int i = 12 / 0;
NullPointerException – terjadi ketika program berusaha mengakses atribut atau
method dari sebuah obyek menggunakan variabel yang tidak merujuk ke sebuah obyek.
Contohnya, ketika variabel referensi obyek belum diinisialisasi atau ketika tidak ada obyek
yang diinstansiasi.
import java.util.Date;
class Npe{
Date d;
void cetak(){
System.out.println(d.toString());
}
public static void main(String[] args){
Npe n = new Npe();
n.cetak(); // terjadi exception karena variabel d
//belum diinisialisasi
}
}
 NegativeArraySizeException – terjadi ketika
program membuat Array dengan indeks negatif.
 ArrayIndexOutOfBoundsException – terjadi ketika
program mengakses elemen Array melebihi
ukuran Array yang bersangkutan.
Penanganan Exception
 Mekanisme try...catch
class ContohEksepsi3 {
public static void main(String[] args) {
int pembilang = 2;
int penyebut = 0;
try {
int hasil = pembilang/penyebut; // menimbulkan eksepsi
System.out.println("Hasil = " + hasil); // tidak
//dieksekusi
}catch(ArithmeticException ae){
System.out.println("KESALAHAN: “+”Pembagian dengan nol");
}
System.out.println("Statemen setelah blok try-catch");
}
}
class ContohEksepsi4 {
public static void main(String[] args) {
int pembilang = 2;
int penyebut = 0;
try {
int hasil = pembilang/penyebut;
// SALAH
System.out.println("Hasil = " + hasil); // tidak
//dieksekusi
} catch (Exception e) {
System.out.println("KESALAHAN: " +
"Terdapat pembagian dengan nol");
}
System.out.println("Statemen setelah blok trycatch");
}
}
 Pada kasus-kasus tertentu (biasanya untuk
proses debugging), mungkin saja anda
menginginkan pesan sebenarnya yang
terkandung dalam exception yang
ditimbulkan. Untuk melakukan hal ini, kita
dapat menggunakan method
getMessage() yang terdapat pada objek
exception yang kita lemparkan.
class ContohEksepsi5 {
public static void main(String[] args) {
int pembilang = 2;
int penyebut = 0;
try {
int hasil = pembilang/penyebut;
// SALAH
System.out.println("Hasil = " + hasil); // tidak
//dieksekusi
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("Statemen setelah blok trycatch");
}
}

Apabila ingin mengeluarkan informasi stack trace, gunakan method
printStackTrace()
class ContohEksepsi6 {
public static void main(String[] args) {
int pembilang = 2;
int penyebut = 0;
try {
int hasil = pembilang/penyebut;
// SALAH
System.out.println("Hasil = " + hasil); // tidak
//dieksekusi
} catch (Exception e) {
e.printStackTrace();
// mencetak stack trace
}
System.out.println("Statemen setelah blok try-catch");
}
}
 Try..catch untuk menangani kesalahan pengaksesan indeks array
public class HaloDunia2{
public static void main(String[] args) {
int i = 0;
String salam[] = {
"Halo Dunia!",
"Apa Kabar!",
"Dahsyat!"
};
try{
while(i < 4){
System.out.println(salam[i]);
i++;
}
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Tak ada indeks ke-"+e.getMessage());
}
}
}
Penanganan Beberapa Tipe
Exception
//PROGRAM 9-8
class BanyakEksepsi {
public static void test(int a, int b) {
try {
int c = a / b;
System.out.println("Hasil bagi: " + c);
int[] Arr = {1,2,3,4,5};
Arr[10] = 11;
// array dengan 5 elemen
// mengakses indeks ke-10
} catch (ArithmeticException ae) {
System.out.println("Terdapat pembagian dengan 0");
System.out.println(ae);
} catch (ArrayIndexOutOfBoundsException oobe) {
System.out.println("Indeks di luar rentang");
System.out.println(oobe);
}
}
public static void main(String[] args) {
test(4, 0);
// menimbulkan ArithmeticException
System.out.println();
test(12, 4); // menimbulkan ArrayIndexOutOfBoundsException
}
}
Urutan Tipe Eksepsi
 Satu hal yang harus diperhatikan dalam
deklarasi statement catch adalah urutan
tipe exception. Kelas exception turunan harus
diletakkan lebih awal daripada kelas
induknya.
class UrutanCatch2 {
public static void main(String[] args) {
int bilangan = 12;
int pembagi = 0;
try {
int hasil = bilangan / pembagi;
System.out.println("Hasil : " + hasil);
} catch (ArithmeticException ae) {
System.out.println("Terdapat pembagian dengan 0");
} catch (RuntimeException e) {
System.out.println("Eksepsi runtime...");
} catch (Exception e) {
System.out.println("Eksepsi generik...");
}
}
}
class UrutanCatch3 {
public static void main(String[] args) {
int bilangan = 12;
int pembagi = 4;
try {
int hasil = bilangan / pembagi;
System.out.println("Hasil : " + hasil);
int[] Arr = {1,2,3,4,5};
Arr[10] = 11;
} catch (ArithmeticException ae) {
System.out.println("Terjadi pembagian dengan 0");
} catch (Exception e) {
System.out.println("Eksepsi generik dieksekusi");
}
}
}
Blok try bersarang
 Kita dapat mendefinisikan blok try-catch bersarang,
yaitu blok try-catch yang berada di dalam blok trycatch yang lain. Apabila blok try-catch bagian dalam
membangkitkan exception dan blok tersebut tidak
mendefinisikan statement catch yang sesuai dengan tipe
exception yang ditimbulkan, maka program akan
memeriksa statement catch yang terdapat pada blok
try-catch bagian luar sampai ditemukan statement
yang sesuai. Apabila ternyata blok bagian luar juga tidak
mendefinisikan statement yang sesuai, maka sistem JAVA
RUNTIME akan menangani exception tersebut dengan
mengeluarkan pesan exception dan menghentikan jalannya
program
class DemoTryBersarang {
private static final int MAX = 100;
public static void test(int n) {
// blok try-catch bagian luar
try {
double hasil = MAX / n;
System.out.println("Hasil bagi : " + hasil);
// blok try-catch bagian dalam
try {
int[] Arr = {1,2,3,4,5};
System.out.println("Arr[" + n + "] : " + Arr[n]);
} catch (NullPointerException npe) {
System.out.println("Pointer null");
System.out.println(npe);
}
} catch (ArithmeticException ae) {
System.out.println("Terjadi pembagian dengan 0");
System.out.println(ae);
} catch (Exception e) {
System.out.println("Eksepsi generik...");
System.out.println(e);
}
}
public static void main(String[] args) {
test(0);
// menimbulkan ArithmeticException
System.out.println();
test(20); // menimbulkan ArrayIndexOutOfBoundsException
}
}
Kata kunci finally
Pada kasus-kasus tertentu, terkadang kita ingin
menempatkan kode yang pasti dieksekusi baik
terjadi exception maupun tidak. Hal ini
biasanya
digunakan pada operasi-operasi yang
berhubungan dengan resource (misalnya:
menutup stream file setelah digunakan). Untuk
itu digunakan kata kunci finally setelah blok
try-catch
class ContohFinally{
public static void main(String[] args) {
int pembilang = 2;
int penyebut = 0;
try {
int hasil = pembilang/penyebut;
// SALAH
System.out.println("Hasil = " + hasil); // tidak
//dieksekusi
}finally{
System.out.println("blok finally selalu dieksekusi");
}
//pernyataan berikut tidak akan dieksekusi
System.out.println("Statemen setelah blok try-catch");
}
}
Kata Kunci throw
 Pada bagian sebelumnya kita membahas
exception yang dibangkitkan secara otomatis
oleh Java runtime
 Kita juga dapat membangkitkan exception
secara manual melalui kode yang kita tulis.
 Pembangkitan exception dilakukan dengan
menggunakan kata kunci throw
 Sintaksnya: throw ObjekException

ObjekException yang dilemparkan adalah objek kelas Throwable maupun
turunan-turunannya

Objek non Throwable tidak dapat dilemparkan, contohnya String

Sebagai contoh, jika kita ingin membangkitkan NullPointerException, maka
sintaksnya:
throw new NullPointerException();, atau
NullPointerException npe = new NullPointerException()
throw npe;
Perhatikan contoh berikut
class Barang {
private String kode;
private String nama;
private double harga;
public void setKode(String vKode) {
try {
kode = vKode;
if (kode == null) {
throw new NullPointerException();
}
} catch (NullPointerException npe) {
System.out.println("KESALAHAN: " + "Kode barang tidak boleh null");
}
}
public String getKode() {
return kode;
}
public void setNama(String vNama) {
try {
nama = vNama;
if (nama == null) {
throw new NullPointerException();
}
} catch (NullPointerException npe) {
System.out.println("KESALAHAN: " +"Nama barang tidak boleh null");
}
}
public String getNama() {
return nama;
}
}
class DemoThrow {
public static void main(String[] args) {
Barang obj = new Barang();
obj.setKode(null);
obj.setNama("Buku tulis");
System.out.println("\nKode : " + obj.getKode());
System.out.println("Nama : " + obj.getNama());
}
}
 Exception yang telah didefinisikan pada Java
memiliki dua tipe konstruktor, yaitu
konstruktor tanpa parameter dan konstruktor
dengan satu parameter bertipe String
 Pada contoh sebelumnya kita hanya
menggunakan konstruktor tipe pertama.
Berikut adalah contoh penggunaan
konstrukstor tipe kedua:
Perhatikan contoh berikut
class Barang {
private String kode;
private String nama;
private double harga;
public void setKode(String vKode) {
try {
kode = vKode;
if (kode == null) {
throw new NullPointerException(“KESALAHAN: Kode barang tidak boleh Null!”);
}
} catch (NullPointerException npe) {
System.out.println(npe.getMessage());
}
}
public String getKode() {
return kode;
}
public void setNama(String vNama) {
try {
nama = vNama;
if (nama == null) {
throw new NullPointerException((“KESALAHAN: nama tidak boleh Null!”);
}
} catch (NullPointerException npe) {
System.out.println(npe.getMessage());
}
}
public String getNama() {
return nama;
}
}
Kata kunci throws
 Apabila didalam method yang potensial
menimbulkan exception tidak disertakan blok
try catch, maka kita harus menggunakan
kata kunci throws pada saat
mendeklarasikan method tersebut.
 Teknik ini dapat digunakan untuk beberapa
tipe exception
 Perhatikan kode di bawah
class ProgramSalah {
public static void test() {
throw new IllegalAccessException( "KESALAHAN: illegal access");
}
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("Statemen setelah blok try-catch");
}
}
 Kode di atas tidak bisa dikompilasi
 Agar dapat dikompilasi, maka perlu
melakukan salah satu dari dua hal:
menggunakan blok try...catch, atau
menggunakan kata kunci throws
 Kode berikut telah dimodifikasi dengan
menggunakan kata kunci throws
class DemoThrows {
public static void test() throws IllegalAccessException{
throw new IllegalAccessException("KESALAHAN: illegal access");
}
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
System.out.println("Eksepsi ditangkap di sini...");
System.out.println(e.getMessage());
}
System.out.println("Statemen setelah blok try-catch");
}
}
Kata kunci throws untuk
beberapa tipe exception
class DemoThrows2 {
public static void test(int n)
throws NullPointerException, ArithmeticException {
if (n < 0) {
throw new NullPointerException(
"KESALAHAN: null pointer");
} else {
throw new ArithmeticException(
"KESALAHAN: arithmetic exception");
}
}
public static void main(String[] args) {
try {
test(-12); // menimbulkan eksepsi
//NullPointerException
test(0); // menimbulkan eksepsi ArithmeticException
} catch (Exception e) {
System.out.println("Eksepsi ditangkap di sini...");
System.out.println(e.getMessage());
}
System.out.println("Statemen setelah blok try-catch");
}
}
Membuat kelas exception
sendiri
 Kita tidak perlu terpaku pada exception-
exception yang terdapat dalam Java
 Java memungkinkan kita mendefinisikan
sendiri exception-exception yang spesifik
sesuai dengan kebutuhan kita
 Untuk membuat kelas exception sendiri, kita
hanya perlu menurunkan dari kelas exception
yang telah ada dalam Java
Contoh kelas exception yang kita definisikan sendiri
class NegativeNumberException extends Exception {
private int bilangan;
// default constructor
NegativeNumberException() {
}
// constructor dengan parameter bertipe String
NegativeNumberException(String pesan) {
super(pesan);
}
// constructor dengan parameter bertipe String dan int
NegativeNumberException(String pesan, int nilai) {
super(pesan);
bilangan = nilai;
}
public int getBilangan() {
return bilangan;
}
}
class DemoMembuatEksepsi3 {
public static int hitungFaktorial(int n) throws NegativeNumberException {
if (n < 0) {
throw new NegativeNumberException("Bilangan tidak boleh negatif", n);
}
int hasil = 1;
for (int i=n; i>=1; i--) {
hasil *= i;
}
return hasil;
}
public static void main(String[] args) {
System.out.println("Pada saat menghitung 5!");
try {
System.out.println("Hasil = “+hitungFaktorial(5));
} catch (NegativeNumberException nne) {
System.out.println("Bilangan : " +nne.getBilangan());
nne.printStackTrace();
}
System.out.println("\nPada saat menghitung -5!");
try {
System.out.println("Hasil = “+hitungFaktorial(-5));
} catch (NegativeNumberException nne) {
System.out.println("Bilangan : “+nne.getBilangan());
nne.printStackTrace();
}
}
}