2009-07-01 22 views
46

Tôi làm cách nào để tạo Exception mới khác với các loại được tạo trước?Tôi có thể viết ngoại lệ tùy chỉnh như thế nào?

public class InvalidBankFeeAmountException extends Exception{ 
    public InvalidBankFeeAmountException(String message){ 
     super(message); 
    } 
} 

Nó sẽ hiển thị cảnh báo cho InvalidBankFeeAmountException được viết trong dòng đầu tiên.

+0

Tôi đã tạo một Ngoại lệ một mình, được hiển thị ở trên. Tạo một lớp với tên của ngoại lệ đặc biệt đó và mở rộng Ngoại lệ. NHƯNG nó có cảnh báo là: Lớp tuần tự Ngoại lệ không khai báo trường tĩnh serialVersionUID cuối cùng dài. Làm thế nào tôi có thể giải quyết nó ????? – Johanna

+1

Bạn không phải lo lắng về cảnh báo đó nếu bạn không muốn. Bởi vì lớp Exception được serializable nó đòi hỏi bạn phải thiết lập một id nối tiếp cho lớp đó. Nhưng, vì nó chỉ là một lời cảnh báo, tôi thường bỏ qua nó. – jjnguy

+0

nhưng khi tôi sử dụng lớp này làm kiểu trong phương thức main(), cảnh báo khác sẽ được hiển thị rằng: Không thể ném loại InvalidBankFeeAmountException. – Johanna

Trả lời

103

Tất cả những gì bạn cần làm là tạo một class mới và có nó extend Exception.

Nếu bạn muốn Exception không được chọn, bạn cần phải extend RuntimeException.

Note: Một kiểm tra Exception là một trong đó đòi hỏi bạn phải hoặc bao quanh Exception trong một khối try/catch hoặc có một 'throws' khoản trên tờ khai phương pháp. (như IOException) Không được chọn Exceptions có thể được ném giống như đã chọn Exceptions, nhưng bạn không bắt buộc phải xử lý chúng một cách rõ ràng theo bất kỳ cách nào (IndexOutOfBoundsException).

Ví dụ:

public class MyNewException extends RuntimeException { 

    public MyNewException(){ 
     super(); 
    } 

    public MyNewException(String message){ 
     super(message); 
    } 
} 
+37

Lưu ý: nếu bạn đang sử dụng Eclipse, chỉ cần viết 'ném mới Ngoại lệ', và sau đó sử dụng Autofix (Ctrl + 1). Điều này sẽ tạo ra một lớp mới cho bạn mở rộng Exception, và chứa mã boilerplate. –

+4

Tôi đã nghe nói rằng có thể thực hành không tốt để mở rộng [RuntimeExceptions] (http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html): * Nếu khách hàng có thể được khôi phục một cách hợp lý từ một ngoại lệ, làm cho nó trở thành một ngoại lệ được kiểm tra. Nếu một khách hàng không thể làm bất cứ điều gì để phục hồi từ trường hợp ngoại lệ, hãy làm cho nó là một ngoại lệ không được kiểm soát. * – Pureferret

+0

Tôi chỉ đọc phần còn lại của câu trả lời, bạn đã có nó, tôi chỉ cần đọc nhiều hơn mã trước khi bình luận. – Pureferret

31

chỉ kéo dài trong hai

  • Exception, nếu bạn muốn ngoại trừ của bạn phải được kiểm tra (ví dụ: yêu cầu trong một ném khoản)
  • RuntimeException, nếu bạn muốn ngoại lệ của bạn để được bỏ chọn.
3

Hãy xem tại địa chỉ:

http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=1

Một ví dụ được đưa ra có trên trang 2:

public class DuplicateUsernameException 
    extends Exception { 
    public DuplicateUsernameException 
     (String username){....} 
    public String requestedUsername(){...} 
    public String[] availableNames(){...} 
} 

cùng với một tập hợp các hướng dẫn khi nào và tại sao bạn muốn tạo ngoại lệ của riêng bạn.

3

Đảm bảo không đi quá mức với các ngoại lệ, đặc biệt là các ngoại lệ đã kiểm tra. Tôi khuyên bạn nên đọc Chương 9 của Java hiệu quả của Joshua Bloch, và đặc biệt là Mục 60 của mình (Ủng hộ việc sử dụng các ngoại lệ tiêu chuẩn). Các khuyến nghị của ông cũng bao gồm việc sử dụng các ngoại lệ đã kiểm tra cho các ngoại lệ có thể được phục hồi, sử dụng các ngoại lệ không được kiểm tra (RuntimeExceptions) cho các lỗi lập trình và tránh việc sử dụng không cần thiết các ngoại lệ đã kiểm tra.

Nếu một ngoại lệ InvalidBankAccount được ném bất cứ khi nào tìm thấy lỗi lập trình, bạn có thể chỉ muốn ném một Java IllegalStateException không được kiểm tra tiêu chuẩn thay thế. (Điều này ngăn cản gọn gàng sự cần thiết phải khai báo serialVersionUID.)

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