Saya menemukan kode yang terlihat seperti ini:
void run() {
try {
doSomething();
} catch (Exception ex) {
System.out.println("Error: " + ex);
throw ex;
}
}
void doSomething() {
throw new RuntimeException();
}
Kode ini mengejutkan saya karena kelihatannya run()
-metode ini mampu melempar Exception
, karena menangkap Exception
dan kemudian memunculkannya kembali, tetapi metode ini tidak dinyatakan untuk melempar Exception
dan tampaknya tidak perlu. Kode ini mengkompilasi dengan baik (setidaknya dalam Java 11).
Harapan saya adalah bahwa saya harus mendeklarasikan throws Exception
dalam run()
-metode.
Informasi tambahan
Dengan cara yang sama, jika doSomething
dideklarasikan untuk melempar IOException
maka hanya IOException
perlu dideklarasikan dalam run()
-metode, meskipun Exception
ditangkap dan dipulihkan.
void run() throws IOException {
try {
doSomething();
} catch (Exception ex) {
System.out.println("Error: " + ex);
throw ex;
}
}
void doSomething() throws IOException {
// ... whatever code you may want ...
}
Pertanyaan
Java biasanya suka kejelasan, apa alasan di balik perilaku ini? Apakah selalu seperti ini? Apa dalam Spesifikasi Bahasa Jawa yang memungkinkan run()
metode tidak perlu mendeklarasikan throws Exception
dalam cuplikan kode di atas? (Jika saya ingin menambahkannya, IntelliJ memperingatkan saya bahwa Exception
tidak pernah dibuang).
-source 1.6
bendera memunculkan kesalahan kompilasi seperti yang diharapkan. Kompilasi dengan kompatibilitas sumber 7 tidak meningkatkan kesalahan kompilasi
In detail, in Java SE 7 and later, when you declare one or more exception types in a catch clause, and rethrow the exception handled by this catch block, the compiler verifies that the type of the rethrown exception meets the following conditions : 1. 1. The try block is able to throw it. 2. There are no other preceding catch blocks that can handle it. 3. It is a subtype or supertype of one of the catch clause's exception parameters.
javac
- Saya telah menemukan kasus di mana kompiler Eclipse lebih lunak.