2012-05-09 24 views
14

bất cứ ai có thể cho tôi biết lý do gì ngoại lệ có thể có, không phải để tương thích với "ném" khoảnLý do ngoại lệ không tương thích với điều khoản ném là gì?

Ví dụ:

class Sub extends Super{ 

    @Override 
    void foo() throws Exception{ 

    } 

} 

class Super{ 

    void foo() throws IOException{ 

    } 
} 

ngoại lệ ngoại lệ không tương thích với ném khoản trong Super.foo()

+1

Vui lòng hiển thị cho chúng tôi mã hoàn chỉnh trình bày sự cố. Bao gồm cả tên lớp đủ điều kiện cho 'Exception' (s) của bạn. –

+1

bạn có thể hiển thị thêm một chút mã của mình và lỗi chính xác mà bạn đang gặp phải không? – aniri

+0

Công trình mỏ. Bạn nên cho chúng ta thấy nhiều mã hơn thế. – Averroes

Trả lời

22

Nếu không có mẫu mã đầy đủ, tôi chỉ có thể đoán: bạn đang ghi đè/triển khai phương thức trong lớp con, nhưng đặc tả ngoại lệ của phương thức lớp con không tương thích với (ví dụ: không phải là tập hợp con) của siêu lớp/phương thức giao diện?

Điều này có thể xảy ra nếu phương pháp cơ sở được khai báo không ném ngoại lệ, hoặc ví dụ: java.io.IOException (là lớp con của java.lang.Exception phương pháp của bạn đang cố gắng ném ở đây). Khách hàng của lớp/giao diện cơ sở mong đợi các trường hợp của nó tuân thủ hợp đồng được khai báo theo phương thức cơ sở, do đó, việc ném Exception từ việc triển khai phương thức đó sẽ phá vỡ hợp đồng (và LSP).

+0

Cảm ơn bạn Péter Török- Sự cố đã đóng –

+0

I biết đó không phải là một trang thảo luận - nhưng tôi không hiểu tại sao LSP không cho phép ** thêm ** cái gì đó ..!? –

+6

Nó cho phép thêm một cái gì đó. Nhưng khi bạn thêm kiểu ngoại lệ vào phương thức ghi đè, bạn không thêm gì đó, nhưng loại bỏ thứ gì đó: với lớp cơ sở, bạn được đảm bảo không bao giờ có ngoại lệ, nhưng với lớp con, bạn sẽ mất bảo đảm này. Đó là lý do tại sao nó bị cấm. –

-1

Trường hợp ngoại lệ được kiểm tra nhằm mục đích sử dụng trong trường hợp một phương pháp có thể mong đợi người gọi của nó được chuẩn bị để đối phó với một số vấn đề có thể phát sinh. Nếu người gọi của BaseFoo.Bar() không bắt buộc phải đối phó với FnordException thì phương pháp DerivedFoo.Bar() không thể mong đợi người gọi của mình đối phó với số FnordException hoặc (vì nhiều người gọi của nó sẽ là những người không được chuẩn bị để có BaseFoo.Bar() ném nó).

Về mặt khái niệm, điều đó thật tuyệt. Trong thực tế, không quá nhiều. Vấn đề là thiết kế ngoại lệ đã kiểm tra trong ngôn ngữ giả định rằng không có người gọi nào được chuẩn bị để đối phó một cách duyên dáng với một vấn đề cụ thể hoặc tất cả người gọi sẽ được chuẩn bị để đối phó với nó. Trạng thái bình thường của các vấn đề trong thực tế là cho người gọi không chuẩn bị để đối phó với ngoại lệ - ngay cả những người mà một số người gọi có thể xử lý. Hầu hết thời gian, quá trình thích hợp của hành động khi mã nhận được một ngoại lệ được kiểm tra nó không rõ ràng mong đợi sẽ được bọc nó trong một ngoại lệ không được kiểm soát và ném đó. Trớ trêu thay, quá trình hành động đơn giản nhất - thêm một mệnh đề "ném" và để cho bong bóng ngoại lệ được kiểm tra lên, có lẽ là một trong số đó ít có khả năng là chính xác. Trong khi có một vài trường hợp (ví dụ: IOException), khi hành vi này có ý nghĩa (ví dụ: khi cố gắng đọc bộ sưu tập từ tệp, lỗi I/O khi đọc một mục là lỗi I/O khi đọc bộ sưu tập), ngoại lệ được ném từ bên trong một cuộc gọi phương thức lồng nhau sẽ đại diện cho một điều kiện khác với ngoại lệ của cùng loại được ném bởi phương thức bên ngoài và mã sẽ được chuẩn bị để xử lý sau có thể không được chuẩn bị để xử lý trước.

Trong trường hợp của bạn, đặt cược tốt nhất của bạn có thể là bắt IOException và bọc nó ở một số loại khác có nguồn gốc từ RuntimeException, lưu ý rằng người gọi của bạn không thể xử lý được.

-1

Để khắc phục nó sử dụng RuntimeException

public T findById(long id) throws RuntimeException { 
    try { 
      return whatEver.create(); 
    } catch (SystemException e) { 
      throw new RuntimeException(e); 
    } 
} 

Hope this helps.

-1

Đảm bảo bạn đã tuyên bố ném vào giao diện của mình. Nếu bạn đã làm, nhưng vấn đề vẫn còn tồn tại - hãy thử lưu/xây dựng lại dự án.

+0

tôi không nghĩ rằng đây là con đường để đi. –

Các vấn đề liên quan