10
Penanganan
Eksepsi
Bab
ini akan mendiskusikan mekanisme penanganan eksepsi pada Java lewat soal dan
penyelesaian. Eksepsi merupakan sebuah kondisi abnormal yang terjadi pada suatu
runtun kode pada saat program dijalankan.
Ini merupakan format umum dari blok penanganan-eksepsi:
try {
// blok
kode untuk memonitor error
}
catch (TipeEksepsi1 exOb) {
// penanganan eksepsi untuk TipeEksepsi1
}
catch (TipeEksepsi2 exOb) {
// penanganan eksepsi untuk TipeEksepsi2
}
// ...
finally {
// blok kode yang akan dieksekusi setelah blok try dieksekusi
}
Soal dan
Penyelesaian
1.
Tulislah program penanganan eksepsi sederhana dalam Java untuk menangani
pembagian nol.
Penyelesaian
class DemoPenangananEksepsi {
public static void main(String args[]) {
int d, a;
try { // memonitor sebuah blok kode.
d = 0;
a = 42 / d;
System.out.println("Ini
tidak akan ditampilkan.");
}
catch (ArithmeticException e) { // menangkap error pembagian nol
System.out.println("Pembagian
oleh nol.");
}
System.out.println("Setelah statemen catch.");
}
}
Keluaran Program
Pembagian oleh nol.
Setelah statemen catch.
2.
Tulis-ulanglah kode pada soal no 1 untuk menciptakan mekanisme
penanganan eksepsi yang lebih baik.
Penyelesaian
// Menangani sebuah eksepsi dan berlanjut.
import java.util.Random;
public class
DemoPenangananEksepsi2 {
public static void main(String args[]) {
int a=0, b=0, c=0;
Random r = new Random();
for(int i=0; i<32000;
i++) {
try {
b = r.nextInt();
c = r.nextInt();
a = 12345 / (b/c);
}
catch (ArithmeticException e) {
System.out.println("Pembagian oleh nol.");
a = 0; // menetapkan
a menjadi nol dan berlanjut
}
System.out.println("a: "
+ a);
}
}
}
Keluaran Program
Pembagian oleh nol.
a: 0
a: -823
a: 6172
Pembagian oleh nol.
a: 0
a: 6172
3.
Tulislah sebuah program yang memuat dua klausa catch.
Penyelesaian
// mendemonstrasikan dua klausa catch.
public class
DuaKlausaCatch {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println("a =
" + a);
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
}
catch(ArithmeticException e)
{
System.out.println("Dibagi
oleh 0: " + e);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Indeks
array melampaui batas: " + e);
}
System.out.println("Setelah blok-blok try/catch.");
}
}
Keluaran Program
a = 0
Dibagi oleh 0: java.lang.ArithmeticException: / by
zero
Setelah blok-blok try/catch.
4.
Tulislah sebuah program yang memuat statemen try bersarang.
Penyelesaian
//Demonstrasi statemen try bersarang
public class
DemoTryBersarang {
public static void main(String args[]) {
try {
int a = args.length;
/* Jika tidak ada arg
command-line, maka
statemen berikut akan
memicu
sebuah eksepsi
pembagian-nol. */
int b = 42 / a;
System.out.println("a =
" + a);
try { // blok try bersarang
/* Jika terdapat
satu arg command-line,
maka eksepsi
pembagian-nol akan dipicu
oleh kode
berikut. */
if(a==1) a = a/(a-a); // pembagian dengan nol
/* Jika terdapat dua
arg command-line, maka
kode berikut akan
memicu eksepsi out-of-bounds. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // generate an out-of-bounds
exception
}
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Indeks
array di luar batas: " + e);
}
}
catch(ArithmeticException e) {
System.out.println("Pembagian
dengan 0: " + e);
}
}
}
Keluaran Program
Pembagian dengan 0: java.lang.ArithmeticException: /
by zero
5.
Tulis-ulanglah kode pada soal no 4 sehingga dihasilkan mekanisme
penanganan eksepsi yang lebih baik.
Penyelesaian
/* Statemen-statemen try dapat secara implisit bersarang melalui
pemanggilan metode. */
class DemoTryBersarangTerperbaiki {
static void
tryBersarang(int a) {
try { // blok try bersarang
/* Jika terdapat satu
arg command-line,
maka eksepsi
pembagian-nol akan dipicu
oleh kode berikut. */
if(a==1) a = a/(a-a); // pembagian nol
/* Jika terdapat dua arg
command-line, maka
kode berikut akan
memicu eksepsi out-of-bounds. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; //
membangkitkan eksepsi out-of-bounds
}
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Indeks
array di luar batas " + e);
}
}
public static void main(String args[]) {
try {
int a = args.length;
/* Jika tidak ada arg command-line, maka
statemen berikut akan
memicu
sebuah eksepsi
pembagian-nol. */
int b = 42 / a;
System.out.println("a =
" + a);
tryBersarang(a);
}
catch(ArithmeticException e) {
System.out.println("Pembagian
nol: " + e);
}
}
}
Keluaran Program
Pembagian nol: java.lang.ArithmeticException: / by
zero
6.
Blok finally akan dieksekusi
setelah blok try/catch selesai dieksekusi dan sebelum
blok yang ada setelah blok try/catch dieksekusi. Blok finally akan dieksekusi tanpa memandang
eksepsi dilempar atau tidak. Jika eksepsi dilempar, blok finally akan dieksekusi bahkan jika tidak ada statemen catch yang sesuai dengan eksepsi yang
dilempar. Tulislah sebuah program untuk mengilustrasikan situasi ini.
Penyelesaian
//mendemonstrasikan finally
public class
DemoFinally {
static void procA() {
try {
System.out.println("di dalam
procA");
throw new
RuntimeException("demo");
}
finally {
System.out.println("finally
pada procA");
}
}
static void procB() {
try {
System.out.println("Di dalam
procB");
return;
}
finally {
System.out.println("finally
pada procB");
}
}
static void procC() {
try {
System.out.println("Di dalam
procC");
}
finally {
System.out.println("finally
pada procC");
}
}
public static void main(String args[]) {
try {
procA();
}
catch (Exception e) {
System.out.println("Eksepsi
ditangkap");
}
procB();
procC();
}
}
Keluaran Program
di dalam procA
finally pada procA
Eksepsi ditangkap
Di dalam procB
finally pada procB
Di dalam procC
finally pada procC
7.
Tulislah sebuah program yang mendeklarasikan subkelas baru dari kelas Exception dan kemudian menggunakannya
untuk menandai error di dalam sebuah metode. Subkelas tersebut juga
mendefinisikan-ulang metode toString,
untuk memberikan deskripsi atas eksepsi yang terjadi.
Penyelesaian
// Program ini menciptakan tipe eksepsi sendiri.
class EksepsiKu extends Exception {
private int detail;
EksepsiKu(int a) {
detail = a;
}
public String toString()
{
return "EksepsiKu["
+ detail + "]";
}
}
public class
DemoEksepsiSendiri {
static void hitung(int a) throws EksepsiKu {
System.out.println("Dipanggil hitung(" + a + ")");
if(a > 10)
throw new EksepsiKu(a);
System.out.println("Keluar normal");
}
public static void main(String args[]) {
try {
hitung(1);
hitung(20);
}
catch (EksepsiKu e) {
System.out.println("Ditangkap
" + e);
}
}
}
Keluaran Program
Dipanggil hitung(1)
Keluar normal
Dipanggil hitung(20)
Ditangkap EksepsiKu[20]
No comments:
Post a Comment