Java throw vs throws: Menguasai Penanganan Pengecualian dengan Contoh Praktis
Java throw vs throws: Menguasai Penanganan Pengecualian dengan Contoh Praktis
Panduan ini menjelaskan cara menggunakan kata kunci throw dan throws Java untuk penanganan pengecualian yang efektif, diilustrasikan dengan contoh kode dunia nyata.
Di Java, pengecualian terbagi menjadi dua kategori:
- Unchecked Exceptions – tidak diverifikasi pada waktu kompilasi tetapi pada waktu runtime. Contoh:
ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, dan semua subclass dari Error. - Checked Exceptions – ditekati oleh kompiler. Contoh:
IOException, InterruptedException, dan banyak lagi.
Untuk wawasan lebih dalam, lihat Java Exceptions.
Unchecked exceptions biasanya menandai kesalahan pemrograman; mereka harus diperbaiki daripada ditangkap. Checked exceptions, di sisi lain, mewakili kondisi yang harus diketahui dan ditangani oleh pemanggil.
Menggunakan Kata Kunci throws
Klausa throws mendeklarasikan bahwa suatu metode dapat melempar satu atau lebih pengecualian, mendelegasikan tanggung jawab kepada pemanggil. Sintaksnya adalah:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 { /* code */ }
Anda dapat mencantumkan beberapa jenis pengecualian, dipisahkan dengan koma.
Contoh 1: Mendeklarasikan Pengecualian yang Diperiksa
import java.io.*; class Main { public static void findFile() throws IOException { // Kode yang mungkin memicu IOException File newFile = new File("test.txt"); FileInputStream stream = new FileInputStream(newFile); } public static void main(String[] args) { try { findFile(); } catch (IOException e) { System.out.println(e); } } }
Output
java.io.FileNotFoundException: test.txt (No such file or directory)
Jika test.txt hilang, FileInputStream melempar FileNotFoundException, yang merupakan subclass dari IOException. Karena findFile() mendeklarasikan throws IOException, metode main() harus menangani atau menyebarkan pengecualian tersebut.
Melempar Beberapa Pengecualian
Anda dapat mendeklarasikan beberapa jenis pengecualian dalam satu klausa throws:
import java.io.*; class Main { public static void findFile() throws NullPointerException, IOException, InvalidClassException { // Potensial melempar NullPointerException … // Potensial melempar IOException … // Potensial melempar InvalidClassException … } public static void main(String[] args) { try { findFile(); } catch (IOException e1) { System.out.println(e1.getMessage()); } catch (InvalidClassException e2) { System.out.println(e2.getMessage()); } } }
Perhatikan bahwa NullPointerException adalah unchecked, jadi tidak perlu ditangkap atau dideklarasikan oleh pemanggil.
Kapan Menggunakan throws vs. try...catch
Menyematkan try...catch dalam setiap metode yang mungkin melempar pengecualian dapat memberatkan kode dan menyelubungi logika. Mendeklarasikan throws menjaga tanda tangan metode tetap bersih dan memungkinkan kode tingkat lebih tinggi untuk memutuskan cara menangani kesalahan.
Menggunakan Kata Kunci throw
Pernyataan throw secara eksplisit melempar instance pengecualian, mentransfer kontrol ke blok catch yang cocok terdekat atau menghentikan program jika tidak ditangani.
Sintaks:
throw throwableObject;
Di sini, throwableObject adalah instance dari Throwable atau salah satu subclass-nya.
Contoh 2: Melempar Pengecualian Tidak Terperiksa
class Main { public static void divideByZero() { throw new ArithmeticException("Mencoba membagi dengan 0"); } public static void main(String[] args) { divideByZero(); } }
Output
Exception in thread "main" java.lang.ArithmeticException: Mencoba membagi dengan 0 at Main.divideByZero(Main.java:3) at Main.main(Main.java:7) exit status 1
Karena ArithmeticException adalah unchecked, menangkapnya opsional.
Contoh 3: Melempar Pengecualian yang Diperiksa
import java.io.*; class Main { public static void findFile() throws IOException { throw new IOException("File tidak ditemukan"); } public static void main(String[] args) { try { findFile(); System.out.println("Sisa kode dalam blok try"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
Output
File tidak ditemukan
Di sini, findFile() melempar IOException yang diperiksa, jadi pemanggil harus menangani atau mendeklarasikannya. Metode main() menunjukkan menangkap pengecualian, mencegah program berakhir.