Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Java-aplikasi Berbasis Teks

Java-aplikasi Berbasis Teks

Pembahasan kali ini akan menitikberatkan pada bahasan penggunaan argument command-line. Selebihnya, Anda akan mempelajari mengenai penggunaan streams untuk mendapatkan nilai input dari user pada saat runtime, sekaligus dalam proses manipulasi file.

Argument Command-Line dan System Properties

Seperti yang telah Anda ketahui pada pembahasan sebelumnya, JAVA mengijinkan user untuk memasukkan data dari command-line. Sebagai contoh, untuk meneruskan argument 1 dan 2 kepada program Java bernama Calculate, anda dapat menuliskan baris berikut pada command prompt.

java Calculate 1 2

Pada contoh berikut ini, data 1 disimpan pada variabel args[0], begitu pula dengan data 2 yang disimpan pada args[1]. Sehingga, tujuan dari deklarasi String args[] sebagai sebuah parameter pada method utama menjadi jelas.
Selain melewatkan argument menuju method utama, Anda juga dapat memanipulasi system properties dari command-line.
System properties hampir menyamai environment variables, namun tidak memiliki ketergantungan pada spesifikasi platform yang digunakan. Sebuah property secara sederhana berupa pemetaan antara property name dan value yang dimilikinya. Hal ini ditunjukkan pada Java dalam class Properties. Class System menyediakan sebuah method untuk menentukan system properties yang digunakan, method getProperties yang menghasilkan sebuah object Properties. Class yang sama juga menyediakan method getProperty yang memiliki dua buah bentuk.
Kita tidak dapat cukup berhenti pada detail dari system properties, namun dilanjutkan dengan memanipulasi system properties yang digunakan. Jika Anda tertarik mempelajari lebih lanjut tentang system properties, Anda dapat menelusuri dokumentasi API yang disediakan.
Anda dapat menggunakan argument opsional –D pada perintah Java dalam command-line untuk menambahkan property baru.
java -D=value
Sebagai contoh, untuk mengatur system property dengan nama user.home bernilai phillipines, gunakan perintah berikut :
java -Duser.home=philippines
Untuk menampilkan daftar system properties yang tersedia pada sistem Anda, gunakan method getProperties seperti yang ditunjukkan sebagai berikut :
System.getProperties().list(System.out);

Membaca Standard Input

Dibandingkan dengan mendapatkan masukan user dari command-line, sebagian user lebih memilih untuk memasukkan data bilamana diminta oleh program pada saat eksekusi. Satu cara dalam melakukan hal ini adalah dengan menggunakan stream.
Sebuah stream adalah abstraksi dari sebuah file atau sebuah perangkat yang mengijinkan beberapa set item untuk dibaca atau ditulis. Streams terhubung dengan physical devices seperti keyboards, consoles dan files. Terdapat dua bentuk umum dari streams, byte streams dan character streams. Byte streams digunakan pada data biner, sedangkan character streams digunakan pada karakter Unicode.
System.in dan System.out adalah dua contoh dari byte streams yang digunakan dalam Java. Contoh pertama mereferensikan pada keyboard, kemudian contoh kedua mereferensikan pada console.
Untuk membaca karakter dari keyboard, Anda dapat menggunakan byte stream System.in yang terdapat pada object BufferedReader. Baris berikut menunjukkan bagaimana untuk melakukan hal tersebut :
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai input dari perangkat input.
ch=(int)br.read(); //method read menghasilkan nilai integer
Cobalah contoh kode berikut :
import java.io.*;
class FavoriteCharacter {
public static void main(String args[]) throws IOException {
System.out.println("Hi, what's your favorite character?");
char favChar;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
favChar = (char) br.read();
System.out.println(favChar + " is a good choice!");
}
}
Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu karakter tiap waktu, gunakan method readLine :
str = br.readLine();
Berikut ini sebuah program yang hampir menyerupai contoh sebelumnya, namun membaca keseluruhan string, bukan satu karakter.
import java.io.*;
class GreetUser {
public static void main(String args[]) throws IOException {
System.out.println("Hi, what's your name?");
String name;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
name = br.readLine();
System.out.println("Nice to meet you, " + name + "! :)");
}
}
Pada saat menggunakan streams, jangan lupa untuk mengimport package java.io seperti yang ditunjukkan dibawah ini :
import java.io.*;
Satu hal lagi yang perlu untuk diingat, pembacaan dari streams dapat menyebabkan terjadinya exception. Jangan lupa untuk menangani exception tersebut menggunakan perintah try-catch atau dengan mengindikasikan exception pada klausa throws dalam method.

Menangani File

Pada beberapa kasus, masukan data disimpan pada sebuah file. Selanjutnya, terdapat beberapa cara jika Anda ingin menyimpan output dari program pada sebuah file. Pada sistem terkomputerisasi, data dari Siswa yang dapat digunakan sebagai input oleh sistem umumnya tersimpan pada sebuah file terpisah. Kemudian, salah satu kemungkinan output dari sistem adalah informasi tentang mata pelajaran yang diikuti oleh siswa. Sekali lagi, output dalam hal ini dapat disimpan dalam sebuah file.
Seperti yang terlihat pada aplikasi, terdapat suatu kebutuhan untuk membaca dan menulis sebuah file. Anda akan mempelajari tentang file input dan output pada bagian ini.

Membaca sebuah File

Untuk membaca sebuah file, Anda dapat menggunakan class FileInputStream.
Berikut ini adalah salah satu constructor dari class tersebut :
FileInputStream(String filename)
Constructor tersebut membuat sebuah koneksi terhadap file dimana nama dari file
tersebut ditunjukkan sebagai sebuah argument.
Exception berupa FileNotFoundException akan muncul jika file tidak ditemukan atau tidak dapat dibuka dan kemudian dibaca.
Setelah membuat sebuah input stream, Anda kemudian dapat menggunakannya untuk membaca sebuah file dengan menggunakan method read. Method read menghasilkan sebuah nilai integer, dan akan menunjukkan nilai 1 jika telah mencapai batas akhir file.
Berikut ini contohnya :
import java.io.*;
class ReadFile {
public static void main(String args[]) throws IOException {
System.out.println("What is the name of the file to read
from?");
String filename;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
filename = br.readLine();
System.out.println("Now reading from " + filename + "...");
FileInputStream fis = null;
try {
fis = new FileInputStream(filename);
} catch (FileNotFoundException ex) {
System.out.println("File not found.");
}
try {
char data;
int temp;
do {
temp = fis.read();
data = (char) temp;
if (temp != -1) {
System.out.print(data);
}
} while (temp != -1);
} catch (IOException ex) {
System.out.println("Problem in reading from the
file.");
}
}
}

Menulis sebuah file

Untuk menuliskan sebuah file, Anda dapat menggunakan class FileOutputStream.
Berikut ini salah satu constructor yang dapat Anda gunakan.
FileOutputStream(String filename)
Contructor tersebut menyediakan jalur output stream terhadap sebuah file yang akan ditulis. Sebuah Exception berupa FileNotFoundException akan muncul jika file yang dimaksud tidak dapat dibuka untuk ditulis.
Jika output stream telah dibuat, Anda dapat menggunakannya untuk menulis file yang dituju menggunakan method write. Method tersebut menggunakan penandaan sebagai berikut :
void write(int b)
Parameter b mereferensikan data yang akan dituliskan pada file sesuai dengan hasil output stream.
Program berikut menunjukkan contoh penulisan terhadap file :
import java.io.*;
class WriteFile {
public static void main(String args[]) throws IOException {
System.out.println("What is the name of the file to be
written to?");
String filename;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
filename = br.readLine();
System.out.println("Enter data to write to " + filename +
"...");
System.out.println("Type q$ to end.");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filename);
} catch (FileNotFoundException ex) {
System.out.println("File cannot be opened for
writing.");
}
try {
boolean done = false;
int data;
do {
data = br.read();
if ((char)data == 'q') {
data = br.read();
if ((char)data == '$') {
done = true;
} else {
fos.write('q');
fos.write(data);
}
} else {
fos.write(data);
}
} while (!done);
} catch (IOException ex) {
System.out.println("Problem in reading from the
file.");
}
}
}


Read More

Package java.lang

Package java.lang

pada kesempatan kali ini saya akan menjabarkan sedikit tentang pakage java.lang, untuk contoh sebaiknya anda langsung praktekan karna akan lebih cepat mengerti.
Java datang dengan beberapa class built-in yang bermanfaat. Mari kita membahas class-class tersebut.

Class Math

Java juga menyediakan konstanta dan method untuk menunjukkan perbedaan operasi matematika seperti fungsi trigonometri dan logaritma. Selama method-method ini semua static, Anda dapat menggunakannya tanpa memerlukan sebuah objek Math.
Untuk melengkapi daftar konstanta dan method-method ini, lihatlah acuan pada dokumentasi Java API.
Dibawah ini beberapa method-method umum yang sering digunakan.
Di bawah ini adalah program yang menunjukkan bagaimana method-method tersebut digunakan.
class MathDemo {
public static void main(String args[]) {
System.out.println("absolute value of -5: " +
Math.abs(-5));
System.out.println("absolute value of 5: " +
Math.abs(-5));
System.out.println("random number(max value is 10): " +
Math.random()*10);
System.out.println("max of 3.5 and 1.2: " +
Math.max(3.5, 1.2));
System.out.println("min of 3.5 and 1.2: " +
Math.min(3.5, 1.2));
System.out.println("ceiling of 3.5: " + Math.ceil(3.5));
System.out.println("floor of 3.5: " + Math.floor(3.5));
System.out.println("e raised to 1: " + Math.exp(1));
System.out.println("log 10: " + Math.log(10));
System.out.println("10 raised to 3: " + Math.pow(10,3));
System.out.println("rounded off value of pi: " +
Math.round(Math.PI));
System.out.println("square root of 5 = " + Math.sqrt(5));
System.out.println("10 radian = " + Math.toDegrees(10) +
" degrees");
System.out.println("sin(90): " +
Math.sin(Math.toRadians(90)));
}
}
Ini adalah contoh output dari program yang dibuat. Coba jalankan program dan bereksperimenlah secara bebas dengan memberikan argument.
absolute value of -5: 5
absolute value of 5: 5
random number(max value is 10): 4.0855332335477605
max of 3.5 and 1.2: 3.5
min of 3.5 and 1.2: 1.2
ceiling of 3.5: 4.0
floor of 3.5: 3.0
e raised to 1: 2.7182818284590455
log 10: 2.302585092994046
10 raised to 3: 1000.0
rounded off value of pi: 3
square root of 5 = 2.23606797749979
10 radian = 572.9577951308232 degrees
sin(90): 1.0

Class String dan StringBuffer

Class String disediakan oleh Java SDK dengan menggunakan kombinasi character literals. Tidak seperti bahasa pemrograman lainnya, seperti C atau C++, strings dapat digunakan menggunakan array dari character atau disederhanakan dengan menggunakan class String. Sebagai catatan, bahwa sebuah objek String berbeda dari sebuah array dari character.

Constructor String

Class String mempunyai 11 constructor. Untuk melihat bagaimana constructor-constructor ini, perhatikan contoh berikut.

class StringConstructorsDemo {
public static void main(String args[]) {
String s1 = new String(); // membuat string kosong
char chars[] = { 'h', 'e', 'l', 'l', 'o'};
String s2 = new String(chars); // s2 = "hello";
byte bytes[] = { 'w', 'o', 'r', 'l', 'd' };
String s3 = new String(bytes); // s3 = "world"
String s4 = new String(chars, 1, 3);
String s5 = new String(s2);
String s6 = s2;
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println(s5);
System.out.println(s6);
}
}

Method-method String

Di bawah ini adalah daftar dari method-method String.
Perhatikan bagaimana method-method tersebut digunakan dalam program di bawah ini.
class StringDemo {
public static void main(String args[]) {
String name = "Jonathan";
System.out.println("name: " + name);
System.out.println("3
rd character of name: " +
name.charAt(2));
/* character yang pertama nampak secara berurutan
mempunyai nilai unicode lebih kecil */
System.out.println("Jonathan compared to Solomon: " +
name.compareTo("Solomon"));
System.out.println("Solomon compared to Jonathan: " +
"Solomon".compareTo("Jonathan"));
/* 'J' mempunyai nilai unicode yang lebih kecil dibanding
'j' */
System.out.println("Jonathan compared to jonathan: " +
name.compareTo("jonathan"));
System.out.println("Jonathan compared to jonathan (ignore
case): " + name.compareToIgnoreCase("jonathan"));
System.out.println("Is Jonathan equal to Jonathan? " +
name.equals("Jonathan"));
System.out.println("Is Jonathan equal to jonathan? " +
name.equals("jonathan"));
System.out.println("Is Jonathan equal to jonathan (ignore
case)? " + name.equalsIgnoreCase("jonathan"));
char charArr[] = "Hi XX".toCharArray();
/* Membutuhkan tambahan 1 untuk indeks endSrc dari
getChars */
"Jonathan".getChars(0, 2, charArr, 3);
System.out.print("getChars method: ");
System.out.println(charArr);
System.out.println("Length of name: " + name.length());
System.out.println("Replace a's with e's in name: " +
name.replace('a', 'e'));
/* Membutuhkan tambahan 1 untuk parameter endIndex dari
substring*/
System.out.println("A substring of name: " +
name.substring(0, 2));
System.out.println("Trim \" a b c d e f \": \"" +
" a b c d e f ".trim() + "\"");
System.out.println("String representation of boolean
expression 10>10: " + String.valueOf(10>10));
/* method toString secara implisit dipanggil method
println */
System.out.println("String representation of boolean
expression 10<10: " + (10<10));
/* Catatan, tidak ada perubahan pada nama objek String
meskipun setelah penggunaan semua method. */
System.out.println("name: " + name);
}
}
Ini adalah output dari program yang dibuat.
name: Jonathan
3rd character of name: n
Jonathan compared to Solomon: -9
Solomon compared to Jonathan: 9
Jonathan compared to jonathan: -32
Jonathan compared to jonathan (ignore case): 0
Is Jonathan equal to Jonathan? true
Is Jonathan equal to jonathan? false
Is Jonathan equal to jonathan (ignore case)? true
content of charArr after getChars method: Hi Jo
Length of name: 8
Replace a's with e's in name: Jonethen
A substring of name: Jo
Trim " a b c d e f ": "a b c d e f"
String representation of boolean expression 10>10: false
String representation of boolean expression 10<10: br="" false="">name: Jonathan

Class StringBuffer

Ketika objek String diciptakan, objek String tidak bisa lagi dimodifikasi. Objek StringBuffer serupa dengan objek String, kecuali kenyataan bahwa objek StringBuffer bersifat dapat berubah atau dapat dimodifikasi, sedangkan pada object String bersifat konstan. Panjang dan isi dapat diubah hingga beberapa pemanggilan method.
Ini adalah beberapa method pada class StringBuffer. K
Lihatlah acuan pada dokumentasi Java API.
Program di bawah ini menunjukkan bagaimana menggunakan method-method tersebut.
class StringBufferDemo {
public static void main(String args[]) {
StringBuffer sb = new StringBuffer("Jonathan");
System.out.println("sb = " + sb);
/* initial capacity is 16 */
System.out.println("capacity of sb: " + sb.capacity());
System.out.println("append \'O\' to sb: " +
sb.append("O"));
System.out.println("sb = " + sb);
System.out.println("3
rd character of sb: " +
sb.charAt(2));
char charArr[] = "Hi XX".toCharArray();
/* Need to add 1 to the endSrc index of getChars */
sb.getChars(0, 2, charArr, 3);
System.out.print("getChars method: ");
System.out.println(charArr);
System.out.println("Insert \'jo\' at the 3rd cell: " +
sb.insert(2, "jo"));
System.out.println("Delete \'jo\' at the 3rd cell: " +
sb.delete(2,4));
System.out.println("length of sb: " + sb.length());
System.out.println("replace: " +
sb.replace(3, 9, " Ong"));
/* Need to add 1 to the endIndex parameter of substring*/
System.out.println("substring (1st two characters): " +
sb.substring(0, 3));
System.out.println("implicit toString(): " + sb);
}
}
Ini adalah output dari program yang telah dibuat di atas. Sekali lagi, bereksperimen secara bebas dengan code-code merupakan cara terbaik mempelajari sintaks-sintaks yang ada.
sb = Jonathan
capacity of sb: 24
append 'O' to sb: JonathanO
sb = JonathanO
3rd character of sb: n
getChars method: Hi Jo
Insert 'jo' at the 3rd cell: JojonathanO
Delete 'jo' at the 3rd cell: JonathanO
length of sb: 9
replace: Jon Ong
substring (1st two characters): Jon
implicit toString(): Jon Ong

Class-class Wrapper

Sesungguhnya, tipe data primitive seperti int, char and long bukanlah sebuah objek.
Sehingga, variabel-variabel tipe data ini tidak dapat mengakses method-method dari
class Object. Hanya objek-objek nyata, yang dideklarasikan menjadi referensi tipe data, dapat mengakses method-method dari class Object. Ada suatu keadaan, bagaimanapun, ketika Anda membutuhkan sebuah representasi objek untuk variabel-variabel tipe primitive dalam rangka menggunakan method-method Java built-in. Sebagai contoh, Anda boleh menambahkan variabel tipe primitif pada objek Collection. Disinilah class wrapper masuk. Class wrapper adalah representasi objek sederhana dari variabel-variabel non-objek yang sederhana. Demikian daftar dari class wrapper.
Nama-nama class wrapper cukup mudah untuk diingat selama nama-nama itu sama dengan tipe data primitive. Dan juga sebagai catatan, bahwa class-class wrapper diawali dengan huruf besar dan versi yang ditunjukkan dari tipe data primitive.
Di bawah ini contoh penggunaan class wrapper untuk boolean.
class BooleanWrapper {
public static void main(String args[]) {
boolean booleanVar = 1>2;
Boolean booleanObj = new Boolean("TRue");
/* primitif ke objek; dapat juga menggunakan method
valueOf */
Boolean booleanObj2 = new Boolean(booleanVar);
System.out.println("booleanVar = " + booleanVar);
System.out.println("booleanObj = " + booleanObj);
System.out.println("booleanObj2 = " + booleanObj2);
System.out.println("compare 2 wrapper objects: " +
booleanObj.equals(booleanObj2));
/* objek ke primitif */
booleanVar = booleanObj.booleanValue();
System.out.println("booleanVar = " + booleanVar);
}
}

Class Process dan Runtime

Class Process

class Process menyediakan method-method untuk memanipulasi proses-proses, seperti mematikan proses, menjalankan proses dan mengecek status proses. Class ini merepresentasikan program- program yang berjalan. Di bawah ini beberapa method pada class Process.

Class Runtime

Di sisi lain, class Runtime merepresentasikan lingkungan runtime. Dua method penting pada class Runtime adalah method getRuntime dan exec.

Membuka Registry Editor

Berikut program untuk membuka registry editor tanpa harus mengetikkan perintah dari command prompt.
class RuntimeDemo {
public static void main(String args[]) {
Runtime rt = Runtime.getRuntime();
Process proc;
try {
proc = rt.exec("regedit");
proc.waitFor(); //cobalah menghapus baris ini
} catch (Exception e) {
System.out.println("regedit is an unknown command.");
}}}

Class System

Class System menyediakan beberapa field dan method bermanfaat, seperti standard input, standard output dan sebuah method yang berguna untuk mempercepat penyalinan bagian sebuah array. Di bawah ini beberapa method menarik dari class System. Sebagai catatan, bahwa semua method-method class adalah static
Ini adalah demo dari beberapa method-method tersebut
import java.io.*;
class SystemDemo {
public static void main(String args[]) throws IOException {
int arr1[] = new int[1050000];
int arr2[] = new int[1050000];
long startTime, endTime;
/* menginisialisasi arr1 */
for (int i = 0; i < arr1.length; i++) {
arr1[i] = i + 1;
}
/* mengkopi secara manual */
startTime = System.currentTimeMillis();
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
endTime = System.currentTimeMillis();
System.out.println("Time for manual copy: " +
(endTime-startTime) + " ms.");
/* menggunakan utilitas copy yang disediakan oleh java –
yaitu method arraycopy */
startTime = System.currentTimeMillis();
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
endTime = System.currentTimeMillis();
System.out.println("Time for manual copy: " + (endTime-
startTime) + " ms.");
System.gc(); //force garbage collector to work
System.setIn(new FileInputStream("temp.txt"));
System.exit(0);
}
}
jalankan program di atas lalu buatlah program baru, sebisa mungkin sering-seringlah berlatih agar lebih cepat memahami java.
Read More

Java-Teknik pemrograman lanjut

Java-Teknik pemrograman lanjut

Modul ini mengenalkan suatu teknik pemrograman yang lebih tinggi. Dalam bagian ini Anda akan mempelajari rekursif dan tipe data abstrak.

Rekursif

Apa yang dimaksud dengan Rekursif?

Rekursif adalah teknik pemecahan masalah yang powerful dan dapat digunakan ketika inti dari masalah terjadi berulang kali. Tentu saja, tipe dari masalah ini dapat dipecahkan mengunakan perkataan berulang-ulang (yaitu, menggunakan konstruksi looping seperti for, while dan do-while).
Sesungguhnya, iterasi atau perkataan berulang-ulang merupakan peralatan yang lebih efisien jika dibandingkan dengan rekursif tetapi rekursif menyediakan solusi yang lebih baik untuk suatu masalah. Pada rekursif, method dapat memanggil dirinya sendiri. Data yang berada dalam method tersebut seperti argument disimpan sementara ke dalam stack sampai method pemanggilnya diselesaikan.

Rekursif Vs. Iterasi

Untuk pengertian yang lebih baik dari rekursif, mari kita lihat pada bagaimana macam-macam dari teknik iterasi. Dalam teknik-teknik tersebut juga dapat kita lihat penyelesaian sebuah loop yang lebih baik menggunakan rekursif daripada iterasi.
Penyelesaian masalah dengan perulangan menggunakan iterasi secara tegas juga digunakan pada struktur kontrol pengulangan. Sementara itu, untuk rekursif, task diulangi dengan memanggil sebuah method perulangan. Maksud dari hal tersebut adalah untuk menggambarkan sebuah masalah ke dalam lingkup yang lebih kecil dari perulangan itu sendiri. Pertimbangkan penghitungan faktorial dalam penentuan bilangan bulat. Definisi rekursif dari hal tersebut dapat diuraikan sebagai berikut: 
factorial(n) = factorial(n-1) * n; 
factorial(1) = 1. 

Sebagai contohnya, nilai faktorial dari 2 sama dengan
fatorial (1)*2, dimana hasilnya adalah 2. 
Faktorial dari 3 adalah 6, dimana sama dengan faktorial dari (2)*3.


Dengan iterasi, proses diakhiri ketika kondisi loop gagal atau salah. Dalam kasus dari penggunaan rekursif, proses yang berakhir dengan kondisi tertentu disebut permasalahan dasar yang telah tercukupi oleh suatu pembatasan kondisi. Permasalahan yang mendasar merupakan kejadian yang paling kecil dari sebuah masalah. 
Sebagai contoh, dapat dilihat pada kondisi rekursif pada faktorial, kasus yang mudah adalah ketika masukannya adalah 1. 1 dalam kasus ini merupakan dasar dari masalah.
Penggunaan dari iterasi dan rekursif dapat bersama-sama memandu loops jika hal ini tidak digunakan dengan benar.
Keuntungan iterasi dibandingkan rekursif adalah performance yang lebih baik. Hal tersebut lebih cepat untuk rekursif sejak terbentuknya sebuah parameter pada sebuah method yang menyebabkan adanya suatu CPU time. Bagaimanapun juga, rekursif mendorong pelatihan perancangan software yang lebih baik, sebab teknik ini biasanya dihasilkan dalam kode yang singkat yang lebih mudah untuk dimengerti dan juga mempromosikan reusability pada suatu solusi yang sebelumnya telah diterapkan.
Memilih antara iterasi dan rekursif merupakan permasalahan dari menjaga keseimbangan antara baiknya sebuah performance dan baiknya perancangan software.

Faktorial: Contoh

Listing program berikut ini menunjukkan bagaimana menghitung faktorial menggunakan teknik iterasi.
class FactorialIter {
static int factorial(int n) {
int result = 1;
for (int i = n; i > 1; i--) {
result *= i;
}
return result;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
System.out.println(factorial(n));
}
}
Dibawah ini merupakan listing program yang sama tetapi menggunakan rekursif.
class FactorialRecur {
static int factorial(int n) {
if (n == 1) {
/* The base case */
return 1;
}
/* Recursive definition; Self-invocation */
return factorial(n-1)*n;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
System.out.println(factorial(n));
}

Print n in any Base: Contoh yang lain

Sekarang, mempertimbangkan dari masalah dalam pencetakkan suatu angka desimal yang nilai basenya telah ditetapkan oleh pengguna. Ingat bahwa solusi dalam hal ini untuk menggunakan repetitive division dan untuk menulis sisa perhitungannya. Proses akan berakhir ketika sisa hasil pembagian kurang dari base yang ditetapkan. 
Dapat diasumsikan jika nilai input desimal adalah 10 dan kita akan mengkonversinya menjadi base 8. Inilah solusinya dengan perhitungan menggunakan pensil dan kertas.
Dari solusi diatas, 10 adalah sama dengan 12 base 8.
Contoh berikutnya. Nilai input desimalnya adalah 165 dan akan dikonversi ke base 16.
165 adalah sama dengan A5 base 16. Catatan: A=10.

Berikut ini merupakan solusi iterative untuk masalah diatas.
class DecToOthers {
public static void main(String args[]) {
int num = Integer.parseInt(args[0]);
int base = Integer.parseInt(args[1]);
printBase(num, base);
}
static void printBase(int num, int base) {
int rem = 1;
String digits = "0123456789abcdef";
String result = "";
/* langkah interasi */
while (num!=0) {
rem = num%base;
num = num/base;
result = result.concat(digits.charAt(rem)+"");
}
/* mencetak reverse dari result */
for(int i = result.length()-1; i >= 0; i--) {
System.out.print(result.charAt(i));
}
}
}
Berikut ini merupakan rekursif untuk masalah yang sama dengan solusi sebelumnya.
class DecToOthersRecur {
static void printBase(int num, int base) {
String digits = "0123456789abcdef";
/* Langkah Rekursif*/
if (num >= base) {
printBase(num/base, base);
}
/* Base case: num < base */
System.out.print(digits.charAt(num%base));
}
public static void main(String args[]) {
int num = Integer.parseInt(args[0]);
int base = Integer.parseInt(args[1]);
printBase(num, base);
}
}

Tipe Data Abstract

Apa yang Dimaksud dengan Tipe Data Abstract?

Abstract Data Type (ADT) adalah kumpulan dari elemen-elemen data yang disajikan dengan satu set operasi yang digambarkan pada elemen-elemen data tersebut. 
Stacks, queues dan pohon biner adalah tiga contoh dari ADT. Dalam bab ini, Anda akan mempelajari tentang stacks dan queues.Stacks

Stack 

adalah satu set atau urutan elemen data dimana manipulasi data dari elemen-elemen hanya diperbolehkan pada tumpukan teratas dari stack. Hal ini merupakan perintah pengumpulan data secara linier yang disebut “last in, first out” (LIFO). Stacks berguna untuk bermacam-macam aplikasi seperti pattern recognition dan pengkonversian antar notasi infix, postfix dan prefix.
Dua operasi yang dihubungkan dengan stacks adalah operasi push dan pop. Push berarti memasukkan data ke dalam stacks yang paling atas dimana pop sebagai penunjuk/pointer untuk memindahkan elemen ke atas stacks. Untuk memahami bagaimana cara kerja stacks, pikirkan bagaimana Anda dapat menambah atau memindakan sebuah data dari tumpukan data. Pikiran Anda akan memberitahu Anda untuk menambah atau memindahkan data hanya pada stack yang paling atas karena jika menggunakan cara lain, dapat menyebabkan tumpukan stack akan terjatuh. 
Dibawah ini merupakan ilustrasi bagaimana tampilan dari stacks.

Stack akan berarti penuh jika jangkauan sel teratas disimbolkan dengan n-1. Jika nilai teratas / top sama dengan -1, stack berarti kosong.

Queues

Queues adalah contoh lain dari ADT. Hal ini merupakan perintah pengumpulan data yang disebut “first-in, first-out”. Aplikasi ini meliputi tugas penjadwalan dalam sistem operasi, topological sorting dan graph traversal.
Enqueue dan dequeue merupakan operasi yang berhubungan dengan queues. Enqueue menunjuk pada memasukkan data pada akhir queue sedangkan dequeue berarti memindahkan elemen dari queue tersebut. Untuk mengingat bagaimana queue bekerja?, 
ingatlah arti khusus dari queue yaitu baris. Berikut ini bagaimana cara kerja queue.
Siapa yang akan mendapatkan kesempatan pertama untuk bertemu bintang idolanya dari mereka yang sedang menunggu dalam sebuah barisan? Seharusnya orang pertama yang berada pada barisan tersebut. Orang ini mendapat kesempatan pertama untuk meninggalkan barisan. Hubungkan hal tersebut dengan bagaimana queue bekerja.
Berikut ini merupakan ilustrasi dari bagaimana tampilan dari qu

Queue akan kosong jika nilai end kurang dari front. Sementara itu, akan penuh jika end sama dengan n-1.

Sequential and Linked Representation

ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Hal ini memudahkan untuk membuat sequential representation dengan menggunakan array.
Bagaimanapun juga, masalah dengan menggunakan array adalah pembatasan size, yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi kekurangan atau kelebihan space memori. Mempertimbangkan hal tersebut, Anda harus membuat sebuah array dan mendeklarasikannya agar mampu menyimpan 50 elemen.
Jika user hanya memasukkan 5 elemen, maka 45 space pada memori akan sia-sia. Disisi lain, jika user ingin memasukkan 51 elemen, space yang telah disediakan didalam array tidak akan cukup.
Dibandingkan dengan sequential representation, linked representation lebih sedikit rumit tetapi lebih fleksibel. Linked representation menyesuaikan memori yang dibutuhkan oleh user. Penjelasan lebih lanjut pada linked representation akan didiskusikan pada bagian berikutnya.

Sequential Representation dari Integer Stack

 

class SeqStack {
int top = -1;/* pada permulaan, stack kosong*/
int memSpace[];/* penyimpanan untuk integer */
int limit;/* ukuran dari memSpace */
SeqStack() {
memSpace = new int[10];
limit = 10;
}
SeqStack(int size) {
memSpace = new int[size];
limit = size;
}
boolean push(int value) {
top++;
/* memeriksa apakah stack penuh */
if (top < limit) {
memSpace[top] = value;
} else {
top--;
return false;
}
return true;
}
int pop() {
int temp = -1;
/* memeriksa apakah stack kosong */
if (top >= 0) {
temp = memSpace[top];
top--;
} else {
return -1;
}
return temp;
}
public static void main(String args[]) {
SeqStack myStack = new SeqStack(3);
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
System.out.println(myStack.pop());
System.out.println(myStack.pop());
System.out.println(myStack.pop());
System.out.println(myStack.pop());
}
}

Linked Lists

Sebelum mengimplementasikan linked representation dari stacks, pertama mari kita pelajari bagaimana membuat linked representation. Dalam hal ini, kita akan menggunakan linked list.
Linked list merupakan struktur dinamis yang berlawanan dengan array, dimana
merupakan struktur statis. Hal ini berarti linked list dapat tumbuh dan berkurang dalam ukuran yang bergantung pada kebutuhan user. Linked list digambarkan sebagai kumpulan dari nodes, Yang masing-masing berisi data dan link atau pointer ke node berikutnya di dalam list.

Gambar dibawah ini menunjukkan tampilan dari node.
Berikut ini merupakan contoh dari non-empty linked list dengan 3 node.
Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk membuat linked list.
class Node {
int data;/* integer data diisikan dalam node */
Node nextNode;/* node selanjutnya dalam list */
}
class TestNode {
public static void main(String args[]) {
Node emptyList = null;
/* membuat list kosong */
/* head points untuk node pertama dalam list */
Node head = new Node();
/* inisialisasi node pertama dalam list */
head.data = 5;
head.nextNode = new Node();
head.nextNode.data = 10;
/* null menandai akhir dari list */
head.nextNode.nextNode = null;
/* mencetak elemen list */
Node currNode = head;
while (currNode != null) {
System.out.println(currNode.data);
currNode = currNode.nextNode;
}
}
}

Linked Representation dari Integer Stack

Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari stack.
class DynamicIntStack{
private IntStackNode top;
class IntStackNode {
int data;
IntStackNode next;
IntStackNode(int n) {
data = n;
next = null;
}
}
/* head atau puncak dari stack */
/* class node */
void push(int n){
/* no need to check for overflow */
IntStackNode node = new IntStackNode(n);
node.next = top;
top = node;
}
int pop() {
if (isEmpty()) {
return -1;
/* may throw a user-defined exception */
} else {
int n = top.data;
top = top.next;
return n;
}
}
boolean isEmpty(){
return top == null;
}
public static void main(String args[]) {
DynamicIntStack myStack = new DynamicIntStack();
myStack.push(5);
myStack.push(10);
/* mencetak elemen dari stack */
IntStackNode currNode = myStack.top;
while (currNode!=null) {
System.out.println(currNode.data);
currNode = currNode.next;
}
System.out.println(myStack.pop());
System.out.println(myStack.pop());
}
}

Java Collections

Saat ini Anda telah diperkenalkan kepada dasar tipe data abstract. Pada intinya, Anda telah mempelajari tentang dasar dari linked lists, stacks dan queue. Berita baik bahwa tipe data abstract telah siap untuk diimplementasikan dan dimasukkan dalam Java. Class Stack dan LinkedList diperbolehkan digunakan tanpa perlu pengertian yang lengkap dari konsep ini.
Bagaimanapun juga, sebagai ilmuwan komputer, sangat penting untuk mengerti konsep dari tipe data abstract. Oleh karena itu, penjelasan terperinci masih disampaikan dalam bagian yang terdahulu. Dengan peluncuran dari J2SE 5.0, queue interface telah tersedia. Untuk detail pada class dan interface ini, dapat dilihat pada dokumentasi Java API.
Kepada kita, Java telah menyajikan classes dan interfaces Collection yang lain, dimana semuanya dapat ditemukan di java.util package. Contoh dari classes Collection termasuk LinkedList, ArrayList, HashSet dan TreeSet. Class tersebut benar-benar implementasi dari collection interfaces yang berbeda. Induk hirarki dari collection interfaces adalah
interfaces Collection itu sendiri. Sebuah collection hanyalah sebuah grup dari object yang diketahui sebagai elemennya sendiri. Collection memperbolehkan penggandaan/salinan dan tidak membutuhkan pemesanan elemen secara spesifik.
SDK tidak menyediakan implementasi built-in yang lain dari interface ini tetapi mengarahkan subinterfaces, interfaces Set dan interfaces List diperbolehkan. Sekarang, apa perbedaan dari kedua interface tersebut. Set merupakan collection yang tidak dipesan dan tidak ada penggandaan di dalamnya. Sementara itu, list merupakan collection yang dipesan dari elemen-elemen dimana juga diperbolehkannya penggandaan. HashSet, LinkedHashSet dan TreeSet suatu implementasi class dari interfaces Set. ArrayList, LinkedList dan Vector suatu implementasi class dari List interfaces.
Berikut ini adalah daftar dari beberapa methods Collections yang disediakan dalam Collection API dari Java 2 Platform SE v1.4.1. Dalam Java 2 Platform SE v.1.5.0, methods ini telah dimodifikasi untuk menampung generic types. Karena generic types masih belum selesai dibahas, sebaiknya mempertimbangkan method ini terlebih dahulu.

Disarankan bahwa Anda mengacu pada Collection methods yang terbaru dimana Anda lebih mudah mengerti generic types, yang akan didiskusikan pada chapter berikutnya.

Anda diharapkan mengacu pada dokumentasi API untuk mengetahui daftar lengkap dari methods dalam interface Collection, List dan Set.
Saat ini kita akan melihat beberapa classes collection. Harap mengacu pada API untuk daftar dari methods yang dimasukkan ke dalam class ini.
Pada bagian sebelumnya, Anda telah melihat bagaimana mengimplementasikan linked list dengan cara Anda sendiri. Java SDK juga telah menyediakan built-implementation dari linked list untuk kita. Class LinkedList berisi methods yang memperbolehkan linked list digunakan seperti stacks, queue atau ADT yang lain. Listing program berikut ini menunjukan bagaimana menggunakan class LinkedList.
import java.util.*;
class LinkedListDemo {
public static void main(String args[]) {
LinkedList list = new LinkedList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
list.add(new Integer(1));
System.out.println(list + ", size = " + list.size());
list.addFirst(new Integer(0));
list.addLast(new Integer(4));
System.out.println(list);
System.out.println(list.getFirst() + ", " +
list.getLast());
System.out.println(list.get(2) + ", " + list.get(3));
list.removeFirst();
list.removeLast();
System.out.println(list);
list.remove(new Integer(1));
System.out.println(list);
list.remove(3);
System.out.println(list);
list.set(2, "one");
System.out.println(list);
}
} 
ArrayList merupakan versi fleksibel dari array biasa. Yang mengimplementasikan List interface. Telitilah kode berikut ini.
import java.util.*;
class ArrayListDemo {
public static void main(String args[]) {
ArrayList al = new ArrayList(2);
System.out.println(al + ", size = " + al.size());
al.add("R");
al.add("U");
al.add("O");
System.out.println(al + ", size = " + al.size());
al.remove("U");
System.out.println(al + ", size = " + al.size());
ListIterator li = al.listIterator();
while (li.hasNext())
System.out.println(li.next());
Object a[] = al.toArray();
for (int i=0; i
HashSet merupakan sebuah implementasi dari interface Set yang mempergunakan hash table. Penggunaan suatu hash table lebih mudah dan cepat untuk melihat lebih detail elemen-elemen yang ada. Tabel tersebut menggunakan suatu rumusan untuk menentukan dimana suatu objek disimpan. Teliti program ini, yang menggunakan class HashSet.
import java.util.*;
class HashSetDemo {
public static void main(String args[]) {
HashSet hs = new HashSet(5, 0.5f);
System.out.println(hs.add("one"));
System.out.println(hs.add("two"));
System.out.println(hs.add("one"));
System.out.println(hs.add("three"));
System.out.println(hs.add("four"));
System.out.println(hs.add("five"));
System.out.println(hs);
}
}
TreeSet merupakan sebuah implementasi dari interface Set yang menggunakan tree.
Class ini memastikan bahwa yang disortir akan diurutkan secara ascending. Perhatikan, bagaimana class TreeSet telah digunakan dalam listing program berikut ini.
import java.util.*;
class TreeSetDemo {
public static void main(String args[]) {
TreeSet ts = new TreeSet();
ts.add("one");
ts.add("two");
ts.add("three");
ts.add("four");
System.out.println(ts);
}
}


Read More

Java-Exception dan Assertion

Java-Exception dan Assertion

Dasar penanganan exception telah dikenalkan pada Anda di pelajaran pemrograman pertama. Bab ini membahas secara lebih dalam mengenai exception dan sedikit menyinggung tentang assertion.

Apa itu Exception?

Pendahuluan

Bugs dan error dalam sebuah program sangat sering muncul meskipun program
tersebut dibuat oleh programmer berkemampuan tinggi. Untuk menghindari pemborosan waktu pada proses error-checking, Java menyediakan mekanisme penanganan exception.
Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi saat runtime, menyebabkan gangguan pada alur eksekusi program. Terdapat beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 0, mengakses elemen di luar jangkauan sebuah array, input yang tidak benar dan membuka file yang tidak ada.

Error dan Exception Classes

Seluruh exceptions adalah subclasses, baik secara langsung maupun tidak langsung, dari sebuah root class Throwable. Kemudian, dalam class ini terdapat dua kategori umum : Error class dan Exception class.
Exception class menunjukkan kondisi yang dapat diterima oleh user program.
Umumnya hal tersebut disebabkan oleh beberapa kesalahan pada kode program.
Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.
Error class digunakan oleh Java run-time untuk menangani error yang muncul pada saat dijalankan. Secara umum hal ini di luar control user karena kemunculannya disebabkan oleh run-time environment. Sebagai contoh adalah out of memory dan harddisk crash.
Contoh:
Perhatikan contoh program berikut :
class DivByZero {
public static void main(String args[]) {
System.out.println(3/0);
System.out.println(“Cetak.”);
}
}
Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut:
Exception in thread "main" java.lang.ArithmeticException: / by
zero at DivByZero.main(DivByZero.java:3)
Pesan tersebut menginformasikan tipe exception yang terjadi pada baris dimana exception itu berasal. Inilah aksi default yang terjadi bila terjadi exception yang tidak tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi, aksi default akan bekerja otomatis. Aksi tersebut pertama-tama akan menampilkan deskripsi exception yang terjadi. Kemudian akan ditampilkan stack trace yang mengindentifikasi method dimana exception terjadi. Pada bagian akhir, aksi default tersebut akan menghentikan program secara paksa.
Bagaimana jika Anda ingin melakukan penanganan atas exception dengan cara yang berbeda? Untungnya, bahasa pemrograman Java memiliki 3 keywords penting dalam penanganan exception, yaitu try, catch dan finally.

Menangkap Exception

Try - Catch

Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan dalam menangani bermacam tipe exception. 3 Keyword tersebut digunakan bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada dua keyword pertama, kemudian membahas finally pada bagian akhir.
Berikut ini adalah penulisan try-catch secara umum :
try {

} catch ( ) {

}
...
} catch ( ) {

}
Petunjuk Penulisan Program :Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait. Penulisan kode dalam blok yang dimasukkan
Gunakan contoh kode tersebut pada program DivByZero yang telah dibuat sebelumnya :
class DivByZero {
public static void main(String args[]) {
try {
System.out.println(3/0);
System.out.println(“Cetak.”);
} catch (ArithmeticException exc) {
//Reaksi atas kejadian
System.out.println(exc);
}
System.out.println(“Setelah Exception.”);
}
}
Kesalahan pembagian dengan bilangan 0 adalah salah satu contoh dari ArithmethicException. Tipe exception kemudian mengindikasikan klausa catch pada class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan deskripsi dari permasalahan.
Output program saat eksekusi akan terlihat sebagai berikut :
java.lang.ArithmeticException: / by zero
After exception.
Bagian kode yang terdapat pada blok try dapat menyebabkan lebih dari satu tipe exception. Dalam hal ini, terjadinya bermacam tipe kesalahan dapat ditangani menggunakan beberapa blok catch. Perlu dicatat bahwa blok try dapat hanya menyebabkan sebuah exception pada satu waktu, namun dapat pula menampikan tipe exception yang berbeda di lain waktu.
Berikut adalah contoh kode yang menangani lebih dari satu exception :
class MultipleCatch {
public static void main(String args[]) { try { int den = Integer.parseInt(args[0]); //baris 4 System.out.println(3/den); //baris 5 } catch (ArithmeticException exc) { System.out.println(“Nilai Pembagi 0.”); } catch (ArrayIndexOutOfBoundsException exc2) { System.out.println(“Missing argument.”); } System.out.println(“After exception.”); } }
Pada contoh ini, baris ke-4 akan menghasilkan kesalahan berupa ArrayIndexOutOfBoundsException bilamana seorang user alpa dalam memasukkan argument, sedang baris ke-5 akan menghasilkan kesalahan ArithmethicException jika pengguna memasukkan nilai 0 sebagai sebuah argument. Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut dimasukkan oleh user :
a) Tidak ada argument
b) 1
c) 0
Penggunaan try bersarang diperbolehkan dalam pemrograman Java.
class NestedTryDemo {
public static void main(String args[]){
try {
int a = Integer.parseInt(args[0]);
try {
int b = Integer.parseInt(args[1]);
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println(“Divide by zero error!");
}
} catch (ArrayIndexOutOfBoundsException) {
System.out.println(“2 parameters are required!");
}
}
}
Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan :
a) Tidak ada argumen
b) 15
c) 15 3
d) 15 0
Kode berikut menggunakan try bersarang tergabung dengan penggunaan method.
class NestedTryDemo2 {
static void nestedTry(String args[]) {
try {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println("Divide by zero error!");
}
}
public static void main(String args[]){
try {
nestedTry(args);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("2 parameters are required!");
}
}
}
Bagaimana output program tersebut jika diimplementasikan terhadap argument – argument berikut :
a) Tidak ada argumen
b) 15
c) 15 3
d) 15 0

Keyword Finally

Saatnya Anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara penggunaan keyword tersebut :
try {

} catch ( ) {

} ...
} finally {

}
Petunjuk Penulisan Program :Sekali lagi, ketentuan penulisan program juga mengatur penggunaan finally seperti halnya pada blok catch. Penggunaan finally dimulai setelah kurung kurawal penutup blok catch terkait. Penulisan dalam blok tersebut juga mengalami indentasi.
Blok finally mengandung kode penanganan setelah penggunaan try dan catch. Blok kode ini selalu tereksekusi walaupun sebuah exception terjadi atau tidak pada blok try. Blok kode tersebut juga akan menghasilkan nilai true meskipun return, continue ataupun break tereksekusi. Terdapat 4 kemungkinan skenario yang berbeda dalam blok try-catch-finally. Pertama, pemaksaan keluar program terjadi bila control program dipaksa untuk melewati blok try menggunakan return, continue ataupun break. Kedua, sebuah penyelesaian normal terjadi jika try-catch-finally tereksekusi secara normal tanpa terjadi error apapun. Ketiga, kode program memiliki spesifikasi tersendiri dalam blok catch terhadap exception yang terjadi. Yang terakhir, kebalikan skenario ketiga. Dalam hal ini, exception yang terjadi tidak terdefinisikan pada blok catch manapun. Contoh dari skenario – skenario tersebut terlihat pada kode berikut ini :
class FinallyDemo {
static void myMethod(int n) throws Exception{
try {
switch(n) {
case 1: System.out.println("case pertama");
return;
case 3: System.out.println("case ketiga");
throw new RuntimeException("demo case
ketiga");
case 4: System.out.println("case keempat");
throw new Exception("demo case
keempat");
case 2: System.out.println("case Kedua");
}
} catch (RuntimeException e) {
System.out.print("RuntimeException terjadi: ");
System.out.println(e.getMessage());
} finally {
System.out.println("try-block entered.");
}
}
public static void main(String args[]){
for (int i=1; i<=4; i++) {
try {
FinallyDemo.myMethod(i);
} catch (Exception e){
System.out.print("Exception terjadi: ");
System.out.println(e.getMessage());
}
System.out.println();
}
}
}

Melempar Exception

Keyword Throw

Disamping menangkap exception, Java juga mengijinkan seorang user untuk melempar sebuah exception. Sintaks pelemparan exception cukup sederhana.
throw <exception object>;
Perhatikan contoh berikut ini.
/* Melempar exception jika terjadi kesalahan input */
class ThrowDemo {
public static void main(String args[]){
String input = “invalid input”;
try {
if (input.equals(“invalid input”)) {
throw new RuntimeException("throw demo");
} else {
System.out.println(input);
}
System.out.println("After throwing");
} catch (RuntimeException e) {
System.out.println("Exception caught here.");
System.out.println(e);
}
}
}

Keyword Throws

Jika sebuah method dapat menyebabkan sebuah exception namun tidak menangkapnya, maka digunakan keyword throws. Aturan ini hanya berlaku pada
checked exception. Anda akan mempelajari lebih lanjut tentang checked exception dan unchecked exception pada bagian selanjutnya, “Kategori Exception”.
Berikut ini penulisan syntax menggunakan keyword throws :
<type> <methodName> (<parameterList>) throws <exceptionList> {
<methodBody>
}
Sebuah method perlu untuk menangkap ataupun mendaftar seluruh exceptions yang mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, RuntimeException, ataupun subclass-nya.
Contoh berikut ini menunjukkan bahwa method myMethod tidak menangani ClassNotFoundException.
class ThrowingClass {
static void myMethod() throws ClassNotFoundException {
throw new ClassNotFoundException ("just a demo");
}
}
class ThrowsDemo {
public static void main(String args[]) {
try {
ThrowingClass.myMethod();
} catch (ClassNotFoundException e) {
System.out.println(e);
}
}
}

Kategori Exception

Exception Classes dan Hierarki

Seperti yang disebutkan sebelumnya, root class dari seluruh exception classes adalah Throwable class. Yang disebutkan dibawah ini adalah exception class hierarki.
Seluruh exceptions ini terdefinisi pada package java.lang.
Sekarang Anda sudah cukup familiar dengan beberapa exception classes, saatnya untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke superclass.
class MultipleCatchError {
public static void main(String args[]){
try {
int a = Integer.parseInt(args [0]);
int b = Integer.parseInt(args [1]);
System.out.println(a/b);
} catch (Exception e) {
System.out.println(e);
} catch (ArrayIndexOutOfBoundsException e2) {
System.out.println(e2);
}
System.out.println("After try-catch-catch.");
}
}
Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception class adalah superclass dari ArrayIndexOutOfBoundsException class.
MultipleCatchError.java:9: exception
java.lang.ArrayIndexOutOfBoundsException has already been caught
} catch (ArrayIndexOutOfBoundsException e2) {

Checked dan Unchecked Exceptions

Exception terdiri atas checked dan unchecked exceptions.
Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang terjadi dalam sintax throws. Apabila checked exception tidak didaftar ataupun ditangkap, maka compiler error akan ditampilkan.
Tidak seperti checked exceptions, unchecked exceptions tidak berupa compile-time checking dalam penanganan exceptions. Pondasi dasar dari unchecked exception classes adalah Error, RuntimeException dan subclass-nya.

User Defined Exceptions

Meskipun beberapa exception classes terdapat pada package java.lang namun tidak mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin terjadi. Sehingga sangat mungkin bahwa Anda perlu untuk membuat tipe exception tersendiri.
Dalam pembuatan tipe exception Anda sendiri, Anda hanya perlu untuk membuat sebuah extended class terhadap RuntimeException class, maupun Exception class lain. Selanjutnya tergantung pada Anda dalam memodifikasi class sesuai permasalahan yang akan diselesaikan. Members dan constructors dapat dimasukkan pada exception class milik Anda.
Berikut ini contohnya :
class HateStringException extends RuntimeException{
/* Tidak perlu memasukkan member ataupun construktor */
}
class TestHateString {
public static void main(String args[]) {
String input = "invalid input";
try {
if (input.equals("invalid input")) {
throw new HateStringException();
}
System.out.println("String accepted.");
} catch (HateStringException e) {
System.out.println("I hate this string: " + input +
".");
}
}
}

Assertions

User Defined Exceptions

Assertions mengijinkan programmer untuk menentukan asumsi yang dihadapi.
Sebagai contoh, sebuah tanggal dengan area bulan tidak berada antara 1 hingga 12 dapat diputuskan bahwa data tersebut tidak valid. Programmer dapat menentukan
bulan harus berada diantara area tersebut. Meskipun hal itu dimungkinkan untuk menggunakan contructor lain untuk mensimulasikan fungsi dari assertions, namun sulit untuk dilakukan karena fitur assertion dapat tidak digunakan. Hal yang menarik dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada saat runtime.
Assertion dapat diartikan sebagai extensi atas komentar yang menginformasikan pembaca kode bahwa sebagian kondisi harus terpenuhi. Dengan menggunakan assertions, maka tidak perlu untuk membaca keseluruhan kode melalui setiap komentar untuk mencari asumsi yang dibuat dalam kode. Namun, menjalankan program tersebut akan memberitahu Anda tentang assertion yang dibuat benar atau salah. Jika assertion tersebut salah, maka AssertionError akan terjadi.

Mengaktifkan dan Menonaktifkan Exceptions

Penggunaan assertions tidak perlu melakukan import package java.util.assert. Menggunakan assertions lebih tepat ditujukan untuk memeriksa parameter dari non-public methods jika public methods dapat diakses oleh class lain. Hal itu mungkin terjadi bila penulis dari class lain tidak menyadari bahwa mereka dapat menonaktifkan assertions. Dalam hal ini program tidak dapat bekerja dengan baik.
Pada non-public methods, hal tersebut tergunakan secara langsung oleh kode yang ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan aktif.
Untuk mengkompilasi file yang menggunakan assertions, sebuah tambahan
parameter perintah diperlukan seperti yang terlihat dibawah ini :
javac –source 1.4 MyProgram.java
Jika Anda ingin untuk menjalankan program tanpa menggunakan fitur assertions, cukup jalankan program secara normal.
java MyProgram
Namun, jika Anda ingin mengaktifkan assertions, Anda perlu menggunakan parameter –enableassertions atau –ea.
java –enableassertions MyProgram

Sintaks Assertions

Penulisan assertions memiliki dua bentuk.
Bentuk yang paling sederhana terlihat sebagai berikut :
assert <expression1>;
dimana  <expression1>  adalah kondisi dimana assertion bernilai true.
Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya :
assert <expression1> : <expression2>;
dimana expression1 adalah kondisi assertion bernilai true dan expression2 adalah informasi yang membantu pemeriksaan mengapa program mengalami kesalahan.
class AgeAssert {
public static void main(String args[]) {
int age = Integer.parseInt(args[0]);
assert(age>0);
/* jika masukan umur benar (misal, age>0) */
if (age >= 18) {
System.out.println(“Congrats! You're an adult!
=)”);
}
}
}


Read More

Inside Post