2011-12-05 28 views
25

Trong một khối multicatch Java 7 như sau:Trong khối Java 7 đa khối, loại ngoại lệ bị bắt là gì?

try { 
    // code that throws exception 
} catch (CharacterCodingException | UnknownServiceException ex) { 
    // handle exception 
} 

loại thời gian biên dịch ex là gì? Có phải đó là lớp học xuất phát nhất mà cả hai loại ngoại lệ đều có điểm chung? Trong ví dụ này có thể là IOException.

+0

nó sẽ làm cho tinh thần để được bất cứ được ném, nhưng bạn có thể dễ dàng kiểm tra bằng cách in ra 'ex.getClass() ' – Jon

+0

Nếu bạn cần phải có hành vi khác nhau dựa trên những gì ngoại lệ bị bắt là, sau đó bạn không nên sử dụng một khối đa khối - phá vỡ nó ra thành nhiều khối catch. –

+2

@Jon: "Loại" là một khái niệm biên dịch-thời gian, bạn đang nói về lớp thời gian chạy của đối tượng. – ColinD

Trả lời

22

Có, loại ex là loại siêu mẫu cụ thể nhất của cả hai số CharacterCodingExceptionUnknownServiceException, là IOException.

Edit: Trực tiếp từ miệng của ngựa trên http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch:

, định lub (ít nhất là trên ràng buộc) là siêu kiểu cụ thể hầu hết các loại trong câu hỏi.

+0

Bạn có bất kỳ tài liệu tham khảo? [Tài liệu Oracle] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html) có vẻ khá sáng. – Andrew

+0

Cập nhật bằng liên kết. – gustafc

+0

Cảm ơn. Chấp nhận câu trả lời nó là. – Andrew

12

Trong JSL 7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510

§14.20> Loại tuyên bố của một số ngoại lệ mà biểu thị loại của nó như là một sự kết hợp với lựa chọn thay thế D1 | D2 | ... | Dn là lub (D1, D2, ..., Dn) (§15.12.2.7).

Định nghĩa của lub() tức là giới hạn trên ràng buộc khá phức tạp. May mắn thay các loại chúng ta đang nói về ở đây thường chỉ đơn giản là các lớp con không chung chung của Throwable, và lub() mang lại một lớp siêu đặc biệt nhất.

Đối với một trường hợp phức tạp hơn, hãy xem xét

class E1 extends Exception implements G<A> 
class E2 extends Error implements G<B> 

lub(E1, E2) = Throwable & G<?> 
Các vấn đề liên quan