Pendahuluan

Blok kode finally di java sudah umum bagi kita semua.

Fungsinya adalah untuk menempatkan kode yang selalu akan dijalankan setelah code try selesai.

Contoh :

 1import java.io.File;
 2import java.io.IOException;
 3
 4public static void main(String[] args) {
 5  try {
 6    File f = new File("D:\\Java\\testFile.txt");
 7    f.createNewFile();
 8    System.out.println("File berhasil dibuat");
 9  } catch (IOException e) {
10    System.out.println("Terjadi kesalahan IO");
11  } finally {
12    System.out.println("Finally block");
13  }
14}

Kode blok finally akan selalu dijalankan,

Kalau semua berjalan lancar, maka kode blok di atas akan menghasilkan :

File berhasil dibuat
Finally block


kalau misalkan terjadi Exception, dalam hal kode di atas, yang terjadi adalah IO Exception, maka hasil dari menjalankan programnya adalah :

Terjadi kesalahan IO
Finally block

Apa tujuannya kode blok finally ini ?

Tujuannya tentu saja tujuan mulia.

Tujuannya agar memberikan ruang bagi Software Engineer untuk selalu membuat bagian Clean Up terhadap code try…catch diatas.

Clean Up ini berguna biasanya untuk proses :

  • Close database connection
  • Close File
  • Free memory
  • Update state dari flow aplikasi.

Jadi walaupun proses di dalam try…catch ini berhasil ataupun gagal, maka proses yang ada di dalam kode blok finally akan selalu dijalankan.

Kebanyakannya yaa itu.. membebaskan sumber daya yang terpakai, seperti connection, IO, memory, status, dll.

Dan perlu diingat, bahwa finally dapat dipakai tanpa harus memakai catch blok, sbb :

 1import java.io.File;
 2import java.io.IOException;
 3
 4public static void main(String[] args) {
 5  try {
 6    File f = new File("D:\\Java\\testFile.txt");
 7    f.createNewFile();
 8    System.out.println("File berhasil dibuat");
 9  } finally {
10    System.out.println("Finally block");
11  }
12}

Kenapa perlu sih ? bukannya bisa dihandle oleh blok catch atau blok yang biasanya ?

Hmm, bisa saja sih, akan tetapi di blok try…catch itu, bisa saja terjadi kasus berikut :

  • di dalamnya, langsung melakukan return nilai, sehingga tidak dilanjutkan ke code selanjutnya.
  • kalau misalnya code ini berada dalam looping, bisa saja langsung melakukan fungsi break atau continue, sehingga tidak ditangkap sebagai sebuah proses yang sequensial.

Proses-proses diatas bisa saja akan membuat program keluar dari blok kode yang sedang dijalankan.

Menambahkan blok finally berarti membuat sebuah state penanda untuk proses yang sequensial yang akan selalu di jalankan.

Menambahkan blok finally merupakan kebiasaan bagus untuk Software Engineer, terutama untuk memastikan bahwa proses Clean Up yang perlu dilakukan tidak tertinggal.

Kapan blok finally bisa saja tidak di execute ?

Defaultnya blok Finally akan dijalankan baik blok kode nya sukses atau melempar exception.

Tetapi ada kasus dimana program tidak sampai ke kode blok finally, atau tidak dieksekusi.

Penyebabnya :

  • terjadi error di JVM (Java Virtual Machine) yang mengeksekusi kode program tersebut, misalnya karena kehabisan memory.
  • proses nya di-kill / terminate sebelum sampai ke kode blok finally.
  • di code utamanya memanggil System.exit();
  • di code utamanya memanggil Runtime.getRuntime().halt(1);

Apakah ada alternatif untuk try…catch…finally ?

Ada, namanya try-with-resources.

Nanti kita akan kulik dan bahas juga.

Cekidot.