Anda di halaman 1dari 23

Penanganan Kesalahan

Devit Suwardiyanto, S.Si., M.T.


Endi Sailul Haq, S.T., M.Kom.
Kesalahan dalam Program

 Ada beberapa kesalahan yang mungkin terjadi selama


kompilasi atau eksekusi.
 Jenis kesalahan dibagi menjadi dua kelompok:
1) compile-time errors
2) run-time errors
Compile-time errors

Kesalahan waktu kompilasi adalah kelas kesalahan yang mencegah


program java mengkompilasi.
Misal:
 kesalahan sintaks: kata kunci salah, simbol yang dilupakan “ ; “ di
akhir pernyataan;
 nama file kode sumber yang buruk;
 memanggil metode yang tidak ada;
 dll
Compile-time errors

public class MyClass {
    public ztatic void main(String args[]) {
        System.out.printn("Hello!");
    }
}

Terdapat kesalahan program:


 salah ketik kata kunci static;
 nama method println salah.
Run-time errors
 Kesalahan run-time ("bug") adalah kesalahan yang terjadi ketika
program sedang berjalan.
 Kesalahan run-time akan menyebabkan program Anda berperilaku
tidak terduga atau bahkan dapat menghentikan eksekusi.
Run-time errors
Ada dua subtipe kesalahan run-time:
 logic errors - ketika suatu program menghasilkan hasil yang salah
karena kode tersebut tidak benar (misalnya, bukannya "Halo!",
program Anda menghasilkan "Hai!");
 unhandled exceptional events seperti pembagian dengan nol, tidak
ditemukan file dan kasus tak terduga lainnya.
Exception
 Exception/pengecualian adalah pengalihan/interupsi program yang
disebabkan run-time error
 Ketika program dijalankan dan terdapat exception, maka jprogram
akan berhenti/crash
Arithmetic Exception
import java.util.Scanner;
public class ArithmeticExceptionDemo {
    public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
 
int a = scanner.nextInt();
int b = scanner.nextInt();
 
// kemungkinan exception terjadi di bawah ini!
System.out.println(a / b); 
System.out.println("finished");
    }
}
Arithmetic Exception

 Jika pada program sebelumnya diinputkan b = 0, maka akan muncul pesan


error seperti berikut

Exception in thread "main" java.lang.ArithmeticException: / by zero
  at ArithmeticExceptionDemo.main(ArithmeticExceptionDemo.java:11)
Arithmetic Scanner scanner = new Scanner(System.in);
Exception  
int a = scanner.nextInt();
int b = scanner.nextInt();
 
Jika diinputkan b = 0, if (b == 0) {
maka akan ditampilkan pesan System.out.println("Division by zero!");
} else {
Division by zero! System.out.println(a / b);
finished }
System.out.println("finished");
NumberFormatException

 Situasi lain yang perlu dipertimbangkan adalah ketika


 mencoba mengubah string menjadi angka integer. Jika string
memiliki format yang tidak sesuai, kode akan mengeluarkan
pengecualian.
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
NumberFormat
// kemungkinan exception 
Exception int number = Integer.parseInt(input); 

System.out.println(number + 1);

Jika diinputkan "121a" Exception in thread "main" java.lang.NumberFormatException: 


For input string: "121a"
  at java.base/java.lang.NumberFormatException.forInputString
(NumberFormatException.java:65)
  at java.base/java.lang.Integer.parseInt(Integer.java:652)
  at java.base/java.lang.Integer.parseInt(Integer.java:770)
  at NumberFormatExceptionDemo.main(NumberFormatExcep
tionDemo.java:9)
Scanner scanner = new Scanner(System.in);
NumberFormat String input = scanner.nextLine();
 
Exception // cek input hanya angka
if (input.matches("\\d+")) { 
int number = Integer.parseInt(input);
System.out.println(number + 1);
} else {
System.out.println
(”Angka yg salah: " + input);
}

Jika diinputkan "121a" Incorrect number: 121a


Exception handling

 Exception handling dimungkinkan untuk menangani pengecualian tanpa

menghentikan keseluruhan program.


 tiga kata kunci untuk menangani pengecualian: try, catch dan finally.
Pernyataan try-catch
try {
    // code that may throw an exception
} catch (Exception e) {
    // code for handling the exception
}

 Blok try digunakan untuk memisolasi kode yang mungkin menyebabkan


kesalahan.
 Blok catch adalah kode yang menagani exception. Blok ini dieksekusi
ketika exception terjadi terjadi di blok try.
Pernyataan try-catch

System.out.println("before the try-catch block"); 
try {
    System.out.println("inside the try block before an exception"); 
Output:     System.out.println(2 / 0); // it throws ArithmeticException
 
before the try-catch block
    System.out.println("inside the try block after the exception
inside the try block before an exception
Division by zero! "); 
after the try-catch block } catch (Exception e) {
    System.out.println("Division by zero!"); 
}
 
System.out.println("after the try-catch block"); 

Program tidak mencetak "inside the try block after the exception" karena ArithmeticException membatalkan aliran normal


eksekusi.
Mendapatkan informasi exception
try {
    double d = 2 / 0;
} catch (Exception e) {
    System.out.println(e.getMessage());
}

Kode tersebut akan mencetak:


An exception occured: / by zero.
Menangkap beberapa exception
try {
    // code that throws exceptions
} catch (IOException e) {
    // handling the IOException and its subclasses
    
} catch (Exception e) {
    // handling the Exception and its subclasses
}

 Ketika pengecualian terjadi di blok try, sistem runtime menentukan blok


catch yang cocok sesuai dengan jenis pengecualian.
 Pencocokan berjalan dari atas ke bawah.
Menangkap beberapa exception
try {
    // code that may throw exceptions
} catch (SQLException | IOException e) {
    // handling SQLException, IOException and their subclasses
    System.out.println(e.getMessage());
} catch (Exception e) {
    // handling any other exceptions
    System.out.println("Something goes wrong");
}

 Dalam kode di atas SQLException dan IOException (alternatif)


dipisahkan oleh “| “. Keduanya akan ditangani dengan cara yang sama.
Blok Finally
try {
    // code that may throw an exception
} catch (Exception e) {
    // exception handler
} finally {
    // code always be executed
}

 Dalam kode ini, blok finally dieksekusi setelah blok catch.


Blok Finally
try {
    System.out.println("inside the try block");
    Integer.parseInt("101abc"); // throws NumberFormatException
} catch (Exception e) {
    System.out.println("inside the catch block");
} finally {
    System.out.println("inside the finally block");
}
System.out.println("after the try-catch-finally block");

Output:
inside the try block
inside the catch block
inside the finally block
after the try-catch-finally block
Kesimpulan Exception

 Pengecualian tidak mencegah program dikompilasi dan dijalankan, tetapi

program macet segera setelah baris dengan pengecualian dijalankan.


 Ada banyak jenis pengecualian.

 Menggunakan pernyataan kontrol untuk menghindari beberapa jenis

pengecualian (seperti ArithmeticException atau NumberFormatException)


Tugas Praktikum

 Tulis kembali semua program yang terdapat dalam slide.


Jalankan dengan kondisi error dan kondisi tidak error.
Amati perbedaannya
 Buatlah program dengan method untuk menghitung luas
alas dan volume sebuah kerucut. Dengan inputan diameter
kerucut. Gunakan penanganan exception dalam program
tersebut agar yang diproses hanya bilangan, bukan
karakter.

Anda mungkin juga menyukai