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 Exceptiondan kemudian memunculkannya kembali, tetapi metode ini tidak dinyatakan untuk melempar Exceptiondan tampaknya tidak perlu. Kode ini mengkompilasi dengan baik (setidaknya dalam Java 11).
Harapan saya adalah bahwa saya harus mendeklarasikan throws Exceptiondalam run()-metode.
Informasi tambahan
Dengan cara yang sama, jika doSomethingdideklarasikan untuk melempar IOExceptionmaka hanya IOExceptionperlu dideklarasikan dalam run()-metode, meskipun Exceptionditangkap 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 Exceptiondalam cuplikan kode di atas? (Jika saya ingin menambahkannya, IntelliJ memperingatkan saya bahwa Exceptiontidak pernah dibuang).
-source 1.6bendera 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.