Artikel itu menerangkan 10 soalan yang paling kerap ditanya tentang pengecualian di Jawa.
1. Boleh disahkan dan tidak boleh disahkan
Ringkasnya, pengecualian yang diperiksa mesti ditangkap secara eksplisit dalam badan kaedah atau diisytiharkan dalam bahagian lontaran kaedah. Pengecualian yang tidak disemak disebabkan oleh masalah yang tidak dapat diselesaikan, seperti pembahagian dengan 0, penunjuk nol, dsb. Pengecualian yang disemak amat penting kerana anda mengharapkan pembangun lain yang menggunakan API anda mengetahui cara mengendalikan pengecualian. Sebagai contoh, IOException ialah pengecualian bertanda yang biasa digunakan, manakala RuntimeException ialah pengecualian tidak bertanda. Sebelum membaca lebih lanjut, lihat
Rajah Pengecualian Hierarki dalam Java .
2. Cara terbaik untuk menangani pengecualian
Jika pengecualian boleh dikendalikan dengan betul, ia mesti ditangkap, jika tidak, ia mesti dimajukan.
3. Mengapa pembolehubah yang ditakrifkan dalam percubaan tidak boleh digunakan dalam tangkapan atau akhirnya?
Dalam sekeping kod berikut, baris yang diisytiharkan dalam blok cuba tidak boleh digunakan dalam blok tangkapan. Kod ini tidak akan disusun.
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
Sebabnya ialah ia tidak diketahui di mana betul-betul di blok cuba pengecualian mungkin telah dilemparkan. Ada kemungkinan pengecualian dilemparkan sebelum objek diisytiharkan. Dan ini benar untuk contoh ini.
4. Mengapakah Double.parseDouble(null) dan Integer.parseInt(null) membuang pengecualian yang berbeza?
Betul, mereka membangkitkan pengecualian yang berbeza. Ini adalah isu JDK. Mereka direka semata-mata oleh orang yang berbeza, dan anda tidak perlu terlalu risau tentangnya.
Integer.parseInt(null);
Double.parseDouble(null);
5. Pengecualian masa jalan asas dalam Java
Berikut adalah beberapa daripadanya:
IllegalArgumentException
ArrayIndexOutOfBoundsException
Ia boleh digunakan dalam pernyataan if apabila syarat tidak dipenuhi, seperti di sini:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. Adakah mungkin untuk menangkap berbilang pengecualian dalam satu blok tangkapan?
Jawapannya YA. Selagi kelas pengecualian ini boleh dikesan sehingga hierarki warisan kelas kepada superclass yang sama, hanya superclass itu boleh digunakan.
7. Bolehkah pembina membuang pengecualian?
Jawapannya YA. Pembina hanyalah sejenis kaedah khas.
Berikut adalah contoh kod.
8. Melontar pengecualian dalam blok akhir
Pada dasarnya, anda boleh melakukan ini secara sah:
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();
}
}
}
Tetapi untuk mengekalkan kebolehbacaan kod, anda perlu mengisytiharkan blok bersarang
try-catch
sebagai kaedah baharu dan memasukkan panggilan ke kaedah 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. Adakah mungkin untuk menggunakan return dalam blok akhirnya?
Ya awak boleh.
10. Mengapakah pembangun mengendalikan pengecualian secara senyap?
Sebagai contoh, kepingan kod sedemikian sering muncul. Jika pengendalian pengecualian yang betul adalah sangat penting, mengapa pembangun terus menulisnya dengan cara ini?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
Ia paling mudah untuk diabaikan. Tetapi walaupun ini sering dilakukan, ia tidak bermakna ia betul. Pautan:
- Pengecualian yang tidak disemak di Jawa
- Akar pokok pengecualian hierarki di Jawa
- Soalan tentang pengecualian pada stackoverflow
Artikel asal
GO TO FULL VERSION