BAB 6 EKSEPSI JAVA CARD DAN PENANGANAN EKSEPSI

Eksepsi adalah kejadian yang mengganggu alur instruksi normal pada saat eksekusi program. Eksepsi penting dalam bahasa Java karena merupakan cara elegan dalam menangani program yang error.

Platform Java Card mendukung semua eksepsi bahasa pemrograman Java. Applet Java Card dapat menggunakan keyword “throw”, “try”, “catch”, atau, “finally”, yang cara kerjanya seperti pada platform Java.

Eksepsi dibuang oleh kelas-kelas JCRE dan JCVM saat terdeteksi masalah runtime internal atau oleh program pada applet. Meskipun platform Java Card mendukung penuh eksepsi Java, ada perbedaan dalam penggunaannya yang dikarenakan lingkungan smart card yang terbatas. Bab ini memperkenalkan eksepsi dalam platform Java Card dan membahas bagaimana applet membuang dan menangani eksepsi.

EKSEPSI DALAM PAKET java.lang

Umumnya, platform Java Card tidak mendukung semua jenis eksepsi yang ditemukan dalam paket inti teknologi Java, karena banyak yang tidak dapat diaplikasikan dalam konteks smart card. Contohnya, “threads” tidak didukung dalam platform Java Card, sehingga tidak ada eksepsi yang berhubungan dengan thread.

Kelas eksepsi dalam paket java.lang pada Java Card ada yang tidak mendukung kelas eksepsi pada paket Java. Pada semua kelas eksepsi yang didukung, hanya disediakan metode “equals” yang berasal dari root kelas Object dan sebuah konstruktor tanpa parameter. Tabel berikut memperlihatkan semua kelas eksepsi dalam paket java.lang pada platform Java Card.

Throwable

Exception

RuntimeException

ArithmeticException

ArrayStoreException

ArrayIndexOutOfBoundsException

ClassCastException

NullPointerException

IndexOutOfBoundsException

SecurityException

NegativeArraySizeException

Kelas Throwable merupakan nenek moyang semua kelas eksepsi pada platform Java Card. Kelas ini menjamin eksepsi Java Card mempunyai arti kata yang sama seperti rekannya dalam platform Java. Contohnya, hanya dapat membuang dan menangkap objek yang berasal dari kelas Throwable.

Kelas Exception merupakan perluasan dari kelas Throwable. Kelas ini adalah root untuk kelas pada semua eksepsi yang diperiksa. Kelas RuntimeException berasal dari kelas Exception dan ini merupakan root untuk kelas pada semua eksepsi yang tidak diperiksa. Konsep eksepsi yang diperiksa dan yang tidak diperiksa dijelaskan pada spesifikasi bahasa Java.

Kelas pada tabel diatas adalah kelas untuk eksepsi yang tidak diperiksa. Kelas eksepsi dalam paket java.lang menyediakan bahasa fundamental sebagai framework eksepsi Java. Eksepsi itu dibuang oleh JCVM saat error terjadi karena pelanggaran terhadap bahasa Java.

EKSEPSI JAVA CARD

Platform Java Card menyediakan hierarki kelas baik untuk eksepsi yang diperiksa maupun tidak diperiksa, seperti diperlihatkan pada gambar berikut,

Eksepsi yang diperiksa adalah bagian dari kelas Exception dan harus ditangkap dalam metode “throwing” atau dideklarasikan dalam klausa “throws” pada header metode. Hal tersebut dilakukan oleh kompiler Java. Semua kelas eksepsi Java Card yang diperiksa berasal dari kelas CardException yang berasal dari kelas Exception.

Untuk 2 alasan, semua eksepsi yang diperiksa harus ditangkap secepatnya oleh applet. Alasan pertama, eksepsi yang diperiksa menunjukkan error dalam pemrograman applet sehingga harus dibenarkan oleh applet. Kedua, eksepsi yang diperiksa adalah bagian penting dari interface pada metode. Karena tidak ada metode API pada applet yang menspesifikasikan eksepsi yang diperiksa dalam klausa “throws”, kompiler Java mengeluarkan error jika tidak menangkap eksepsi yang diperiksa.

Eksepsi yang tidak diperiksa, sering disebut runtime exceptions, adalah bagian kelas RuntimeException dan tidak perlu ditangkap dalam program ataupun dideklarasikan dalam klausa “throws”. Eksepsi yang tidak diperiksa biasanya menunjukkan masalah runtime yang tidak dapat diduga, kesalahan pemrograman, atau kesalahan pemrosesan APDU. Eksepsi tersebut ditangkap oleh level paling luar pada JCRE. Semua eksepsi yang tidak diperiksa dalam platform Java Card merupakan perluasan dari kelas CardRuntimeException, yang berasal dari kelas RuntimeException.

Mengapa kita butuh kelas CardException dan CardRuntimeException? Karena kelas tersebut memungkinkan mekanisme penyimpanan resource sehingga objek eksepsi dapat digunakan kembali beberapa kali, seperti yang akan dijelaskan selanjutnya.

Reason code pada eksepsi Java Card

Kelas eksepsi Java menyediakan pesan string yang menunjukkan kesalahan yang spesifik. Kelas String tidak didukung dalam platform Java Card, sehingga pesan string tidak dapat disediakan dalam eksepsi. Sebagai alternatif untuk memperoleh informasi yang detail pada eksepsi, kelas eksepsi Java Card menyediakan reason code yang numerik. Reason code digunakan untuk menjelaskan dengan detail mengenai alasan pembuangan eksepsi. Tipe reason code adalah “short”.

Reason code merupakan field dalam kelas CardException dan CardRuntimeException, dengan demikian diturunkan oleh subclass-nya. Disamping itu, ke-2 kelas tersebut mendefinisikan 2 metode “public” (getReason dan setReason) untuk mengambil dan men-setting reason code.

Membuang eksepsi dalam platform Java Card

Untuk membuang eksepsi dalam sistem Java, applet membuat instans dari kelas eksepsi, dan kodenya ditulis sebagai berikut:

throw new MyException (“a specific error message”);

Tentunya, kamu dapat membuat objek eksepsi yang baru setiap saat eksepsi dibuang dalam platform Java Card. Namun, segi ekonomi selalu diutamakan dalam smart card. Jika applet membuat objek pada setiap saat eksepsi dibuang, applet akan selalu mengakumulasi banyak instans eksepsi yang tidak digunakan dalam memori EEPROM.

Untuk mengoptimalkan penggunaan memori, semua objek eksepsi harus dibuat dulu sebelumnya (saat inisialisasi) dan referensinya disimpan dengan permanen. Ketika eksepsi terjadi, applet tidak membuat objek eksepsi yang baru, akan tetapi melakukan hal berikut ini:

  1. Mengambil dan menggunakan lagi referensi untuk objek eksepsi yang diingini.
  2. Mengisi reason code objek.
  3. Membuang objek.

Agar objek eksepsi dapat digunakan lagi, JCRE membuat instans terlebih dahulu dari tiap jenis eksepsi pada API Java Card. Kelas CardException, CardRuntimeException, dan subclass-nya menyediakan metode static yaitu throwIt pada applet agar instans eksepsi dapat digunakan lagi:

public static void throwIt (short reason);

Metode throwIt membuang instans eksepsi yang dibuat JCRE setiap saat dipanggil. Applet menspesifikasn reason code pada metode throwIt. Contohnya, untuk menolak perintah APDU, applet dapat membuang ISOException dan menunjukkan reason code “perintah yang tidak diijinkan”:

ISOException.throwIt (ISO7816.SW_COMMAND_NOT_ALLOWED);

Applet dapat membuat objek eksepsinya sendiri. Selama inisialisasi, applet menginstansiasi eksepsi objek dan menyimpan referensinya dalam field persisten. Kemudian, applet menggunakan lagi instannya kapanpun dibutuhkan untuk membuang eksepsi.

ISOException

ISOException adalah jenis eksepsi khusus yang tidak diperiksa dalam API Java Card. Eksepsi ini muncul saat runtime untuk menunjukkan peringatan atau kesalahan pemrosesan dalam kartu. ISOException mengenkapsulasi Status Word (SW) yaitu respon yang diatur dalam ISO 7816.

ISOException menjadikan applet dapat menghadapi error secara efisien. Saat perintah diproses dengan sukses, metode mengembalikan hasil dengan normal. Tapi jika error terjadi, metode dengan mudah membuang ISOException dengan SW yang cocok.

Biasanya, applet tidak menangani ISOException. JCRE dengan cepat menangkap ISOException dan mengembalikan SW ke aplikasi host. Platform Java Card menyediakan interface javacard.framework.ISO7816 yang mendefinisikan banyak SW yang biasanya digunakan dan berhubungan dengan ISO7816-3 dan ISO7816-4. Applet dapat mendefinisikan SW-nya dan dapat menggunakan ISOException untuk mengirim SW ke aplikasi host.

UserException

Ketika applet mengalami kesalahan pemrograman yang perlu dibenarkan oleh applet, applet membuang UserException. Tidak seperti ISOException, UserException adalah eksepsi yang diperiksa yang berasal dari CardException dan oleh karena itu harus ditangani oleh applet. Jika applet ingin membuat tipe eksepsi tambahan, applet dapat membuat kelas yang berasal dari UserException.

Sumber: from book Java card Technology for Smart Card, Architecture and Programmer’s Guide

This entry was posted in Java Card. Bookmark the permalink.