Artikel ini menjelaskan 10 pertanyaan paling umum tentang pengecualian di Java.
1. Dapat diverifikasi dan tidak dapat diverifikasi
Singkatnya, pengecualian yang dicentang harus secara eksplisit ditangkap di badan metode atau dideklarasikan di bagian lemparan metode. Pengecualian yang tidak dicentang disebabkan oleh masalah yang tidak dapat diselesaikan, seperti pembagian dengan 0, penunjuk nol, dll. Pengecualian yang dicentang sangat penting karena Anda mengharapkan pengembang lain yang menggunakan API Anda mengetahui cara menangani pengecualian. Misalnya, IOException adalah pengecualian yang umum digunakan, sedangkan RuntimeException adalah pengecualian yang tidak dicentang. Sebelum membaca lebih lanjut, lihat
Diagram Pengecualian Hierarki di Java .
2. Cara terbaik untuk menangani pengecualian
Jika pengecualian dapat ditangani dengan benar, maka harus ditangkap, jika tidak maka harus diteruskan.
3. Mengapa variabel yang ditentukan di try tidak dapat digunakan di catch atau akhirnya?
Pada potongan kode berikut, baris yang dideklarasikan di blok try tidak dapat digunakan di blok catch. Kode ini tidak dapat dikompilasi.
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
Alasannya adalah tidak diketahui di blok try mana pengecualian tersebut dilemparkan. Ada kemungkinan bahwa pengecualian diberikan sebelum objek dideklarasikan. Dan ini berlaku untuk contoh ini.
4. Mengapa Double.parseDouble(null) dan Integer.parseInt(null) memberikan pengecualian yang berbeda?
Benar, mereka memunculkan pengecualian yang berbeda. Ini adalah masalah JDK. Mereka hanya dirancang oleh orang yang berbeda, dan Anda tidak perlu terlalu mengkhawatirkannya.
Integer.parseInt(null);
Double.parseDouble(null);
5. Pengecualian runtime dasar di Java
Berikut ini beberapa di antaranya:
IllegalArgumentException
ArrayIndexOutOfBoundsException
Mereka dapat digunakan dalam pernyataan if ketika kondisinya tidak terpenuhi, seperti di sini:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. Apakah mungkin untuk menangkap banyak pengecualian dalam satu blok tangkapan?
Jawabannya iya. Selama kelas pengecualian ini dapat ditelusuri hingga hierarki pewarisan kelas ke superkelas yang sama, hanya superkelas tersebut yang dapat digunakan.
7. Bisakah konstruktor memberikan pengecualian?
Jawabannya iya. Konstruktor hanyalah jenis metode khusus.
Berikut adalah contoh kode.
8. Melempar pengecualian di blok terakhir
Pada prinsipnya, Anda dapat melakukan ini secara legal:
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Namun untuk menjaga keterbacaan kode, Anda perlu mendeklarasikan blok bersarang
try-catch
sebagai metode baru, dan memasukkan panggilan ke metode ini ke dalam blok
finally
.
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9. Apakah mungkin menggunakan return di blok akhirnya?
Ya kamu bisa.
10. Mengapa pengembang menangani pengecualian secara diam-diam?
Misalnya, potongan kode seperti itu sering muncul. Jika penanganan pengecualian yang tepat sangat penting, mengapa pengembang terus menulis dengan cara ini?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
Paling mudah untuk diabaikan. Namun meski sering dilakukan, bukan berarti benar. Tautan:
- Pengecualian Tidak Dicentang di Java
- Akar pohon pengecualian hierarki di Java
- Pertanyaan tentang pengecualian pada stackoverflow
Artikel asli
GO TO FULL VERSION