IKG2I4 / Software Project I
Mahmud Imrona, M.T. Izzatul Ummah, M.T.
Kelompok Keahlian Algoritma dan Komputasi
LECTURE NOTE
WEEK 6
Abstract Class Interface
Exception
WEEK 6
Misalkan kita ingin membuat program permainan di mana di dalamnya ada class Human yang
diturunkan menjadi class Raja, class Prajurit, dan class Petani. Pada sistem ini, kita juga
menginginkan setiap objek harus diinstansiasi dari class raja/prajurit/petani, yang berarti tidak boleh ada objek human yang diinstansiasi.
Bagaimana konsep OOP memfasilitasi aturan pada sistem tersebut? Jawabannya adalah
Abstract class adalah class yang tidak dapat diinstansiasi objectnya.
Abstract class biasanya diterapkan pada sebuah superclass.
Superclass dibuat abstract supaya tidak dapat diinstansiasi objectnya. Programmer hanya bisa menginstansiasi turunan dari superclass tersebut. Abstract class boleh memiliki atribut dan method
ABSTRACT CLASS
Cara penulisan abstract class: abstract class Human{
String name; }
Abstract method adalah header method, yaitu method yang tidak dituliskan implementasi
algoritmanya, atau dengan kata lain yang dituliskan hanya headernya saja.
Bila sebuah class memiliki minimal 1 abstract method, maka class tersebut harus dijadikan abstract juga.
Akan tetapi, sebuah abstract class tidak harus
ABSTRACT METHOD
Cara penulisan abstract method: abstract class Human{
String name;
abstract void berjalan(int jarak); }
Method berjalan() tidak perlu diimplementasikan algoritmanya di class Person. Method itu hanya bisa diimplementasikan di class-class turunannya
ABSTRACT METHOD
Ilustrasi yang lebih jelas misalnya pada permainan catur. Kita
definisikan abstract class Bidak, yang diturunkan menjadi class Raja, Ratu, Gajah, Kuda, Benteng, Pion.
abstract class Bidak{
abstract void berjalan(int jarak, int arah); }
Class Bidak dibuat abstract karena setiap bidak pasti adalah instansiasi dari salah satu class turunannya.
Method berjalan dibuat abstract karena tidak perlu
diimplementasi-ABSTRACT METHOD
Method berjalan harus diimplementasikan di class turunan. class Raja{
abstract void berjalan(int jarak, int arah){
……..Raja bisa berjalan satu langkah ke semua arah }
}
class Kuda{
abstract void berjalan(int jarak, int arah){
….. Kuda berjalan dengan langkah berbentuk huruf L
ABSTRACT METHOD
Tiap class turunan mengimplementasikan method
berjalan secara berbeda-beda, tergantung bagaimana
aturan atau cara bergerak/berjalan masing-masing bidak.
ABSTRACT METHOD
Class turunan dari class abstract harus
mengimplementasikan semua method abstract yang diwarisi dari class induknya. Bila ada 1 method abstract warisan yang tidak diimplementasikan, maka class
turunan itu harus menjadi abstract juga.
Sebuah class tidak boleh mengextend ke dua superclass, tidak peduli superclass itu abstract atau bukan. Hal ini
karena Java hanya mensupport single inheritance.
ABSTRACT METHOD
Di bawah ini adalah method abstract: public abstract method berjalan();
Tapi yang di bawah ini bukan method abstract, melainkan method kosong:
public abstract method berjalan(){ }
Interface adalah class yang lebih “abstrak” dibandingkan class abstract.
Interface adalah class abstract yang seluruh methodnya adalah method abstract (tidak memiliki method biasa). Semua atribut di dalam interface secara otomatis bersifat public static final. Di dalam interface tidak boleh ada
atribut private, dan tidak ada method get dan set.
INTERFACE
Jadi interface mirip seperti file header pada ADT (ingat kembali Praktikum Pemrograman Terstruktur II). Contoh pada ADT LIST ada file list.h.
Akan tetapi konsep/kegunaan interface berbeda dengan file header pada ADT. Perbedaannya adalah:
–Konsep ADT tidak terkait dengan inheritance
–Konsep interface terkait erat dengan inheritance. Java tidak menyediakan fitur multiple-inheritance, akan tetapi Java menyediakan fitur interface sebagai penggantinya.
Konsep/kegunaan interface adalah memberi peran-peran (roles) pada sebuah class.
Misalkan kita sedang membuat sistem akademik, di
mana di dalamnya kita mendefinisikan class Dosen dan class Mahasiswa.
Class Dosen memiliki method mengajar(), belajar(), membuatSoal(), menilaiUjian(), menerimaGaji(), dsb. Class Mahasiswa memiliki method belajar(),
Selain itu, kita juga mendefinisikan class Asisten di mana asisten memiliki peran campuran yaitu sebagai
mahasiswa dan juga sebagai “dosen junior”.
Asisten harus mengimplementasikan semua method
Mahasiswa serta semua (atau sebagian) method Dosen. Bagaimana Java memfasilitasi kebutuhan sistem tsb? Jawabnya adalah: menggunakan interface.
Kita buat 2 buah interface yaitu InterDosen dan InterMahasiswa.
–Class Dosen menginduk kepada InterDosen.
–Class Mahasiswa menginduk kepada InterMahasiswa.
–Class Asisten menginduk kepada InterDosen dan InterMahasiswa. Menginduk di sini tidak menggunakan syntax “extends” melainkan “implements”.
Perhatikan bahwa sebuah class dapat meng-implements
INTERFACE
Agar lebih lengkap, kita buat juga abstract class Person, di mana semua class Dosen, Mahasiswa, dan Asisten harus meng-extends ke class tersebut dan harus meng-implements ke interface yang sesuai. Cara penulisannya adalah sbb:
abstract class Person{ String nama;
void makan(); }
interface InterDosen{
INTERFACE
interface InterMahasiswa{
void hadirKuliah(); // method di interface harus abstract }
class Dosen extends Person implements InterDosen{ void makan(){ ……. } void mengajar(){ ……. } }
INTERFACE
class Mahasiswa extends Person implements InterMahasiswa{ void makan(){ ……. } void hadirKuliah(){ ……. } }
INTERFACE
class Asisten extends Person implements InterMahasiswa, InterDosen{ void makan(){ ……. } void hadirKuliah(){ ……. } void mengajar(){ ……. } }
INTERFACE
Ada 2 jenis error yang bisa terjadi ketika kita membuat program:
–Compile-time error: yaitu error yang terjadi saat
program dicompile, ciri-cirinya yaitu program tidak lulus compile, umumnya terjadi karena kesalahn penulisan
syntax (kurang titik koma atau kurung tutup dsb)
–Run-time error: yaitu error yang terjadi saat program
dijalankan, ciri-cirinya yaitu program tetap lulus compile tapi ketika dijalankan bisa terjadi error (tergantung pada nilai variabel yang diolah), misalnya pembagian dengan
EXCEPTION HANDLING
Beberapa contoh runtime error:
–Pembagian dengan angka nol
–Pengaksesan array melebihi batas kapasitas array
–Kesalahan parsing dan formatting number
–Program gagal membuka file
–Program gagal menerima input dari keyboard
–Pengaksesan terhadap object yang belum diinstansiasi (belum di-new, jadi masih NULL)
Exception handling berguna untuk mencegah runtime error.
Beberapa exception yang penting misalnya:
–ArithmeticException –NullPointerException –ArrayIndexOutOfBoundsException –NumberFormatException –IOException
EXCEPTION HANDLING
Berikut ini adalah contoh pembagian dengan nol. public static void main(String[] args) throws Exception{
int a=5; int b=0; int c=a/b;
System.out.println(“Nilai c = “,c); }
Program di atas dapat dicompile, tapi ketika dirun akan error, karena terjadi exception pada baris c=a/b, atau kita katakan bahwa program “melempar” exception pada baris
EXCEPTION HANDLING
Untuk menangani exception tersebut, gunakan mekanisme try-catch. Baris yang bermasalah dapat dimasukkan ke
dalam blok try, dan gunakan exception handling yang sesuai untuk “menangkap” (catch) exception yang mungkin terjadi. public static void main(String[] args) throws Exception{
int a=5; int b=0; int c; try{ c=a/b; }
EXCEPTION HANDLING
Exception yang terjadi karena pengaksesan object yang masih NULL (belum diinstansiasi/new)
Segiempat se1 = new Segiempat(5,3); Segiempat se2; // objectnya masih null se1.printAttribute();
try{
se2.setPanjang(7);
} catch (NullPointerException npe){
System.out.println("Masuk ke Null Pointer Exception");
NULL POINTER EXCEPTION
Exception yang terjadi karena mengakses array dengan indeks melebihi batas kapasitasnya.
int[] arrNIM = {3010666,3010777,3010999}; try {
System.out.println(arrNIM[3]); }
catch (ArrayIndexOutOfBoundsException aobe) {
System.out.println("Masuk ke Array Index Out Of
ARRAY INDEX OUT OF BOUND
Exception yang terjadi karena parsing number. Coba modifikasi program berikut ini dengan
exception handling yang sesuai.
public static void main(String[] args) { String str = "50a\ju79hj3@sdjf";
int i = 0;
i = Integer.parseInt(str); // class Wrapper System.out.println("i="+i);
Bagaimana exception dapat terjadi/dilempar?
Exception adalah class khusus pada Java Library (src) yang diturunkan dari class Throwable.
–Lihat java.lang.Exception
Semua jenis exception lainnya
(ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException,
NumberFormatException, dsb) adalah turunan
CLASS EXCEPTION
Exception yang tidak ditangani (tidak di-catch) dapat menyebabkan program berhenti (halt)
ketika dijalankan. Exception bisa terjadi bisa juga tidak, tergantung pada nilai variabel yang diolah. Exception terjadi secara beruntun
(chain-reaction), misalnya kita membuat methodX(),
yang di dalamnya memanggil methodY(), yang di dalamnya memanggil methodZ(). Ternyata ketika methodZ() dieksekusi terjadi exception, maka
Exception handling bisa dilakukan di
method-method mana saja yang kita inginkan, mencakup:
–Method yang mengandung baris exception
–Method yang memanggil method lain yang mengandung baris exception
Sebelumnya telah dibahas bagaimana cara:
–Menangani atau menangkap (catch) exception yang
dilempar oleh program. Untuk menangkap suatu exception harus menggunakan jenis exception handling yang sesuai dengan jenis exception tersebut.
Sekarang akan dibahas bagaimana cara:
–Membuat program yang melempar (throw) exception yang jenisnya sudah ada di Java Library
–Membuat jenis exception sendiri sesuai kebutuhan (yang
THROW
Berikut adalah contoh sederhana melempar exception:
–Exception harus diinstansiasi dulu (new) sebelum dilempar
public static void main(String args[]) throws Exception{ int d=6;
int e=1; int f=0;
if (e==1) { throw new Exception("Ngapain ngebagi dengan satu!"); }
Sekarang kita akan membuat jenis exception sendiri, yaitu exception yang menangani nilai
input negatif. Pada class Segiempat, panjang dan lebar tidak boleh negatif.
class NegatifException extends Exception { public void printPesanError(){
System.out.println("Nilai panjang dan lebar tidak boleh negatif");
NegatifException tersebut kemudian di-new lalu dilempar di dalam method setPanjang & setLebar.
public void setPanjang(int p) throws NegatifException{
if (p<0) {
throw new NegatifException(); } else {
panjang = p;
Method setLebar dengan exception:
public void setLebar(int l) throws NegatifException{ if (l<0)
{
throw new NegatifException(); } else {
lebar = l; }
}
Ketika method setPanjang dan setLebar tersebut dipanggil di Driver, method-method tersebut
harus ditempatkan di dalam blok try-catch. class Driver {
public static void main(String args[]) { Segiempat se = new Segiempat(); try {
se.setPanjang(5); se.setLebar(-3);
} catch (NegatifException ne) { ne.printPesanError();