Monday, December 26, 2016

Bab 10. Soal & Penyelesaian Java


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