Perbedaan Antara Lempar dan Lempar di Jawa

1. Perkenalan

Dalam tutorial ini, kita akan melihat lemparan dan lemparan di Java. Kami akan menjelaskan kapan kami harus menggunakan masing-masing.

Selanjutnya, kami akan menunjukkan beberapa contoh penggunaan dasarnya.

2. Buang dan Melempar

Mari kita mulai dengan perkenalan singkat. Kata kunci ini terkait dengan penanganan pengecualian. Pengecualian dimunculkan ketika aliran normal aplikasi kita terganggu.

Mungkin ada banyak alasan. Seorang pengguna dapat mengirim data masukan yang salah. Kami dapat kehilangan koneksi atau situasi tak terduga lainnya dapat terjadi. Penanganan pengecualian yang baik adalah kunci agar aplikasi kita tetap berfungsi setelah munculnya momen-momen tidak menyenangkan itu.

Kami menggunakan kata kunci lemparan untuk secara eksplisit membuang pengecualian dari kode. Ini mungkin metode atau blok statis apa pun. Pengecualian ini harus merupakan subclass dari Throwable. Juga, itu bisa menjadi Throwable itu sendiri. Kami tidak bisa melempar banyak pengecualian dengan satu lemparan .

Kata kunci lemparan dapat ditempatkan dalam deklarasi metode. Ini menunjukkan pengecualian mana yang dapat dilemparkan dari metode ini. Kita harus menangani pengecualian ini dengan coba-coba.

Kedua kata kunci ini tidak dapat dipertukarkan!

3. Lempar di Jawa

Mari kita lihat contoh dasar dengan memberikan pengecualian dari metode ini.

Pertama-tama, bayangkan kita sedang menulis kalkulator sederhana. Salah satu operasi aritmatika dasar adalah pembagian. Karena itu, kami diminta untuk mengimplementasikan fitur ini:

public double divide(double a, double b) { return a / b; }

Karena kita tidak dapat membagi dengan nol, kita perlu menambahkan beberapa modifikasi pada kode kita yang sudah ada. Sepertinya ini momen yang bagus untuk mengajukan pengecualian.

Mari kita lakukan:

public double divide(double a, double b) { if (b == 0) { throw new ArithmeticException("Divider cannot be equal to zero!"); } return a / b; }

Seperti yang Anda lihat, kami telah menggunakan ArithmeticException yang sangat sesuai dengan kebutuhan kami. Kita bisa melewatkan satu parameter konstruktor String yang merupakan pesan pengecualian.

3.1. Latihan yang baik

Kami harus selalu memilih pengecualian yang paling spesifik. Kita perlu menemukan kelas yang paling cocok untuk acara luar biasa kita. Misalnya, lemparkan NumberFormatException, bukan IllegalArgumentException. Kita harus menghindari memberikan Pengecualian yang tidak spesifik .

Misalnya, ada kelas Integer dalam paket java.lang . Mari kita lihat salah satu deklarasi metode pabrik:

public static Integer valueOf(String s) throws NumberFormatException 

Ini adalah metode pabrik statis yang membuat instance Integer dari String. Jika ada input String yang salah , metode ini akan menampilkan NumberFormatException.

Ide yang bagus adalah mendefinisikan pengecualian kita sendiri yang lebih deskriptif. Di kelas Kalkulator kami, misalnya DivideByZeroException.

Mari kita lihat contoh penerapannya:

public class DivideByZeroException extends RuntimeException { public DivideByZeroException(String message) { super(message); } }

3.2. Membungkus Pengecualian yang Ada

Terkadang kami ingin menggabungkan pengecualian yang ada ke dalam pengecualian yang ditentukan oleh kami.

Mari kita mulai dengan mendefinisikan pengecualian kita sendiri:

public class DataAcessException extends RuntimeException { public DataAcessException(String message, Throwable cause) { super(message, cause); } }

Konstruktor mengambil dua parameter: pesan pengecualian, dan penyebab, yang bisa berupa subkelas Throwable.

Mari kita tulis implementasi palsu untuk fungsi findAll () :

public List findAll() throws SQLException { throw new SQLException(); }

Sekarang, di SimpleService, mari kita panggil fungsi repositori, yang dapat menghasilkan SQLException:

public void wrappingException() { try { personRepository.findAll(); } catch (SQLException e) { throw new DataAccessException("SQL Exception", e); } }

Kami melemparkan kembali SQLException yang dibungkus dengan pengecualian kami sendiri yang disebut DataAccessException. Semuanya diverifikasi dengan tes berikut:

@Test void whenSQLExceptionIsThrown_thenShouldBeRethrownWithWrappedException() { assertThrows(DataAccessException.class, () -> simpleService.wrappingException()); }

Ada dua alasan untuk melakukan ini. Pertama-tama, kami menggunakan pembungkusan pengecualian, karena kode lainnya tidak perlu mengetahui tentang setiap kemungkinan pengecualian dalam sistem.

Juga komponen tingkat yang lebih tinggi tidak perlu mengetahui tentang komponen tingkat bawah, atau pengecualian yang mereka lemparkan.

3.3. Multi-Catch dengan Java

Terkadang, metode yang kami gunakan dapat memberikan banyak pengecualian berbeda.

Mari kita lihat blok coba-tangkap yang lebih luas:

try { tryCatch.execute(); } catch (ConnectionException | SocketException ex) { System.out.println("IOException"); } catch (Exception ex) { System.out.println("General exception"); }

The mengeksekusi Metode dapat melempar tiga pengecualian: SocketException, ConnectionException, Exception. Blok catch pertama akan menangkap ConnectionException atau SocketException . Blok catch kedua akan menangkap Exception atau subclass Exception lainnya. Ingat, kita harus selalu menangkap pengecualian yang lebih detail terlebih dahulu.

Kita bisa menukar urutan blok tangkapan kita. Kemudian, kami tidak akan pernah menangkap SocketException dan ConnectionException karena semuanya akan masuk ke tangkapan dengan Exception .

4. Melempar di Jawa

Kami menambahkan lemparan ke deklarasi metode.

Let's take a look at one of our previous method declaration:

public static void execute() throws SocketException, ConnectionException, Exception

The method may throw multiple exceptions. They are comma-separated at the end of a method declaration. We can put both, checked and unchecked exceptions in the throws. We have described the difference between them below.

4.1. Checked and Unchecked Exceptions

A checked exception means that it's checked at the compile time. Note, that we must handle this exception. Otherwise, a method must specify an exception by using throws keyword.

The most common checked exceptions are IOException, FileNotFoundException, ParseException. FileNotFoundException may be thrown when we create FileInputStream from File.

There's a short example:

File file = new File("not_existing_file.txt"); try { FileInputStream stream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); }

We can avoid using try-catch block by adding throws to the method declaration:

private static void uncheckedException() throws FileNotFoundException { File file = new File("not_existing_file.txt"); FileInputStream stream = new FileInputStream(file); }

Unfortunately, a higher level function still has to handle this exception. Otherwise, we have to put this exception in method declaration with throws keyword.

As the opposite, unchecked exceptions aren't checked at the compile time.

The most common unchecked exceptions are: ArrayIndexOutOfBoundsException, IllegalArgumentException, NullPointerException.

Unchecked exceptions are thrown during runtime. The following code will throw a NullPointerException. Probably it's one of the most common exceptions in Java.

Calling a method on a null reference will result in this exception:

public void runtimeNullPointerException() { String a = null; a.length(); }

Let's verify this behavior in the test:

@Test void whenCalled_thenNullPointerExceptionIsThrown() { assertThrows(NullPointerException.class, () -> simpleService.runtimeNullPointerException()); }

Harap diingat bahwa kode dan tes ini tidak banyak artinya. Ini hanya untuk tujuan pembelajaran menjelaskan pengecualian waktu proses.

Di Java, setiap subclass Error dan RuntimeException merupakan pengecualian yang tidak dicentang. Pengecualian yang dicentang adalah yang lainnya di bawah kelas Throwable .

5. Kesimpulan

Pada artikel ini, kita telah membahas perbedaan antara dua kata kunci Java: melempar dan melempar. Kami telah mempelajari penggunaan dasar dan berbicara sedikit tentang praktik yang baik . Kemudian kita telah membicarakan tentang pengecualian yang dicentang dan yang tidak dicentang.

Seperti biasa, kode sumber dapat ditemukan di GitHub kami.

Jika Anda ingin mempelajari lebih dalam tentang penanganan Exception di Java, lihat artikel kami tentang pengecualian Java.