2011-08-28 42 views
19

Tôi đang làm việc với API tuyên bố trả về true nếu thành công và giả mạo nếu không thành công. Nhưng, nó cũng tuyên bố ném các ngoại lệ khác nhau nếu nó không thành công. Làm thế nào nó có thể trả về sai và ném một ngoại lệ?Trả về một giá trị VÀ ném một ngoại lệ?

Trả lời

25

Không thể ném cả ngoại lệ và trả về giá trị từ một cuộc gọi chức năng duy nhất.

Có thể nó hoạt động giống như trả lại false nếu có lỗi, nhưng sẽ ném ngoại lệ nếu đầu vào không hợp lệ.

chỉnh sửa: PaulPRO đăng tải một câu trả lời (nay là phần tử bị xoá) chỉ ra rằng nó là kỹ thuật thể gây ra một ngoại lệ được ném vào một chủ đề khác nhau, trong khi trả lại một giá trị trong hiện tại. Tôi nghĩ điều này đáng chú ý, ngay cả khi đó không phải là điều bạn nên thấy.

+0

Đó là những gì tôi đã tìm. Tôi nghĩ rằng có thể có một số thủ thuật với một khối cuối cùng mặc dù. – mark

+0

một khi ngoại lệ được ném chương trình của bạn ngừng chạy để imho nó không thể làm cả hai. Tôi tự hỏi nếu bạn có câu lệnh trả về trong khối 'try' của mình, chương trình vẫn chuyển khối 'cuối cùng' hay không, bởi vì nếu bạn trả về một giá trị trong khối try và đặt một ngoại lệ ném vào khối cuối cùng bạn sẽ đã thực hiện cả hai .. –

+2

@ Karel-Jan Misseghers: không, trong Java chương trình của bạn không ** DEFINITELY NOT ** ngừng chạy khi một ngoại lệ được ném. Bạn đang bối rối như thế nào ngoại lệ Java làm việc và rõ ràng đã không thực hiện bất kỳ lập trình Java đa luồng nào được nêu ra. Bạn có thể có rất nhiều chủ đề vui vẻ tiếp tục làm việc khi một ngoại lệ không được kiểm tra xảy ra trong một chuỗi khác. Có rất nhiều trường hợp mà thread chết được tự động khởi động lại (cái nổi tiếng nhất là EDT của Swing trên một số hệ điều hành/JVM: nếu EDT chết, một EDT mới được khởi động lại). – SyntaxT3rr0r

14

Bạn có thể ném một ngoại lệ mà một (trong trường hợp này boolean) giá trị:

public class ValueException extends Exception { 
    final boolean value; 

    public ValueException(boolean value, String message) { 
     super(message); 
     this.value = value; 
    } 

    public boolean getValue() { 
     return value; 
    } 
} 
0

Mặc dù có thể viết mã của bạn trong một cách mà một ngoại lệ và giá trị có thể được bắt nguồn từ một cuộc gọi chức năng (xem các bài viết trên), nó KHÔNG BAO GIỜ được thực hiện trong mã hóa thích hợp.

Tôi rất muốn thấy liên kết đến tài liệu trên API này. API nên đặt ưu tiên cho sự rõ ràng. Ném một ngoại lệ và trả về một giá trị để lại câu hỏi liệu giá trị đã trả lại có an toàn để sử dụng hay không nếu nó không hợp lệ.

Hãy nhớ rằng, khối try/catch là phương thức xử lý ngoại lệ KHÁC. Chúng không vượt qua ngoại lệ đối với phương thức gọi, nhưng xử lý nó theo cách nội bộ theo cách mà nhà phát triển thấy phù hợp.

Nếu, vì mục đích gỡ lỗi, bạn cần xem giá trị kết quả trong trường hợp ngoại lệ, ý tưởng của Bohemian hoạt động tốt.

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