2010-03-25 20 views
47

Hãy phương pháp nàyNgoại lệ nào để ném khi thiếu thông số/phụ thuộc quan trọng?

/** 
* @return List of group IDs the person belongs to 
* 
*/ 
public List<String> getGroups() { 
    if (this.getId().equals("")) return null; 
} 

Tôi muốn ném ngoại lệ thay vì trở về null, ngoại trừ để ném khi một tham số quan trọng/phụ thuộc chưa được thiết lập là gì?

+6

Mã này sẽ tăng NPE nếu 'getID()' trả về giá trị rỗng. Nó sẽ là tốt hơn để sử dụng 'if (" ".equals (this.getId())) ...' –

+0

Tôi đã xác định trong một lớp trừu tượng và có một thử bắt bên trong, và sẽ trả về chuỗi rỗng trên thất bại. – Pentium10

Trả lời

71

Tôi muốn sử dụng IllegalArgumentException nếu thông số/đối số được kiểm soát từ bên ngoài hoặc IllegalStateException nếu phương pháp chỉ được gọi là sai thời điểm (trạng thái). Trong trường hợp cụ thể của bạn, tôi nghĩ rằng đó là sau này. Một thay thế (không rõ ràng) là NullPointerException.

Tuy nhiên, điều này nên được ghi rõ trong @throws để người dùng hiểu lý do.

+0

Ngữ cảnh của câu hỏi thực sự bị giới hạn. Theo như tôi thấy, ISE là lựa chọn tốt nhất. Tôi cũng đã tuyên bố rõ ràng rằng, vì vậy tôi không thấy làm thế nào điều đó là xấu :) – BalusC

+0

Có phép thuật làm thế nào tôi có thể cập nhật phần bình luận trong Eclipse để tự động lấy lại phần @params bị thiếu và thêm phần @throws? Có lẽ một phím tắt? – Pentium10

+0

Xin lỗi, không biết điều đó. Nó sẽ được tự động thêm vào các trường hợp ngoại lệ không phải là thời gian chạy (khi bạn tạo/cập nhật mệnh đề 'throws'), nhưng không phải cho các ngoại lệ thời gian chạy. – BalusC

2

Tôi sẽ sử dụng IllegalStateException vì id là trạng thái của chủ sở hữu. Nếu id sẽ được thông qua như tham số, một IllegalArgumentException sẽ là đúng.

0

Tôi sẽ tạo loại Ngoại lệ của riêng mình bằng cách mở rộng Ngoại lệ. Bằng cách đó, các chức năng gọi điện có thể bắt được Ngoại lệ đặc biệt đó và xử lý nó một cách duyên dáng khi thích hợp. Lưu ý, bạn có thể làm điều tương tự với bất kỳ thứ gì mở rộng ngoại lệ, nhưng tôi thích tạo các lớp Ngoại lệ của riêng mình để tôi có thể rất mạnh trong xử lý ngoại lệ của mình. Đây là, tất nhiên, tùy thuộc vào bạn.

+0

Tại sao tái tạo lại bánh xe? IllegalArgumentException được thực hiện chính xác cho một đối số bất hợp pháp. –

+0

Nó phụ thuộc vào có bao nhiêu loại đối số bất hợp pháp mà bạn muốn bẫy. Tôi thích mở rộng Excpetion, hoặc trong trường hợp này IllegalArgumentException chỉ để có một lớp Exception cụ thể để đối phó với các loại điều kiện khác nhau mà tôi muốn giải quyết. Nó làm cho xử lý ngoại lệ dễ dàng hơn và mạnh mẽ hơn, IMHO. -Jay – Jay

2

Nếu không thể đảm bảo rằng id luôn được đặt (bằng cách yêu cầu nó trong hàm tạo chẳng hạn, nơi bạn có thể kiểm tra xem id hợp lệ đã được chuyển) thì tôi nghĩ các đề xuất khác để ném IllegalStateException là chính xác. Nhưng sẽ tốt hơn nếu bạn thử và đảm bảo rằng đối tượng của bạn không thể vào trạng thái này ngay từ đầu nếu có thể

1

Thay vì ném một ngoại lệ, bạn chỉ cần trả lại một danh sách trống. Nếu một phụ thuộc/tham số không được đáp ứng, thì không có kết quả. Từ các nhận xét và mã được đăng, có vẻ như đó là hành vi mong đợi. Nếu id trống, thì không có nhóm nào được đính kèm, do đó, một danh sách trống.

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