2010-10-27 40 views
5

Là xác minh này cho dù đối tượng thông qua null hay không là OK hoặc tôi nên sử dụng một loại bằng() phương pháp?đối tượng! = Null xác minh

public void addCard(Card card) throws IllegalArgumentException { 
     if (card != null){ 
      cardList.add(card); 
     } else { 
      throw new IllegalArgumentException(); 
     } 
    } 

Trả lời

17

tôi thích để làm điều đó như thế này:

/** 
* Adds a card to the deck. 
* 
* @param the card to add. 
* @throws IllegalArgumentException if the card is null. 
*/ 
public void addCard(final Card card) 
{ 
    if(card == null) 
    { 
     throw new IllegalArgumentException("card must not be null"); 
    } 

    cardList.add(card); 
} 
  1. nó ít mã để đọc
  2. nó tách điều kiện lỗi từ tình trạng mong đợi (không có khác = không thụt lề)
  3. ai cần xem những gì trên dòng X để thấy rằng biến thẻ là null = ít thời gian hơn cho những người tìm kiếm để tìm hiểu những gì họ đã làm sai.
  4. không cần phải lộn xộn mã với vô ném báo cáo - bạn nên Javadoc nó mặc dù với một khoản @throws

Ngoài ra, bạn đang làm điều đó đúng, theo ý kiến ​​của tôi.

+0

Cảm ơn bạn đã bình luận. Không chắc chắn nếu tôi có tuyên bố thứ 4. Bạn có nghĩa là tôi không phải ném một ngoại lệ ở đây? – Eugene

+0

@AndroidNoob - Bạn cần phải ném ngoại lệ, bạn không cần phải * tuyên bố * rằng bạn ném nó. 'public void addCard (Card card)' của chính nó là đủ, bởi vì IllegalArgumentException là một RuntimeException. –

+0

Ah ok, hiểu rồi, cảm ơn! – Eugene

3

Khi bạn so sánh tham chiếu, bạn nên sử dụng !=. Sử dụng equals sẽ ném một ngoại lệ.

1

Nếu bạn chỉ muốn xác minh xem thẻ đang được thêm vào không phải là null, mã của bạn sẽ hoạt động tốt. Bạn chỉ cần chắc chắn để xử lý các IllegalArgumentException khi bạn gọi addCard.

+4

Bạn không nên xử lý ngoại lệ - bạn chỉ đơn giản là tránh chuyển qua giá trị rỗng. IllegalArgumentException nên khá nhiều * không bao giờ * bị bắt một cách rõ ràng. –

+0

Đó là một điểm tốt. Điểm chính của tôi là điều này sẽ đủ để kiểm chứng.Tôi chỉ nghĩ rằng nó thường là tốt hơn để xử lý các ngoại lệ này để người dùng không nhìn thấy một ứng dụng bị treo, nhưng nó phụ thuộc vào tình hình. –

21

Đúng vậy, nhưng cá nhân tôi sẽ cấu trúc theo cách khác. Đó là thông thường để xác nhận đối số vào lúc bắt đầu của phương pháp này, và sau đó sử dụng chúng cho phần còn lại của phương pháp này biết họ đúng:

public void addCard(Card card) { 
    if (card == null) { 
     throw new IllegalArgumentException("Attempt to add null card"); 
    } 
    cardList.add(card); 
} 

Lợi ích của việc thực hiện tất cả các thử nghiệm lý luận lên phía trước là nếu một đối số không hợp lệ được chuyển cho bạn, bạn sẽ ném một ngoại lệ trước khi bất kỳ tác dụng phụ nào xảy ra - hơn là một nửa thông qua phương thức, có thể để đối tượng ở trạng thái không hợp lệ. Tất nhiên trong trường hợp này không quan trọng, nhưng tôi ủng hộ tính thống nhất ở đây :)

Lưu ý rằng không cần khai báo IllegalArgumentException - đó là lớp con của RuntimeException, có nghĩa là nó không được kiểm tra (bạn không cần khai báo nó).

+0

+1: có các bài kiểm tra ở trên cùng cũng là một số loại tài liệu –

5

Bạn có thể sử dụng lớp commons-langValidate. Nó làm cho mã của bạn ngắn hơn và đơn giản hơn:

public void addCard(Card card) { 
    Validate.notNull(card); 
    cardList.add(card); 
} 

nó sẽ ném một IllegalArgumentException với một thông điệp mặc định (bạn có thể vượt qua một thông báo tùy chỉnh như một cuộc tranh luận thứ 2, nếu bạn thích)

+0

Hoặc Hợp đồng nếu bạn ở trong C# 4 – Squirrel

6

Effective Java từ Josh Blosh khuyến cáo như sau:

/** 
* ads a card to card list. 
* 
* @param card card to add. Can not be null 
* 
*/ 
public void addCard(Card card) { 
     if (card == null) { 
      throw new NullPointerException("Card can not be null") 
     } 
     cardList.add(card); 
    } 

Vì vậy, trước hết bạn không khai báo RuntimeException. Thứ hai, bạn ném một NullPointerException bởi vì đối số của bạn không đơn giản là không chính xác - nó là null. Thứ ba, bạn chỉ định các đối số trong javadoc, chúng có thể là null hay không.

+0

Tôi thích điều này tốt hơn. – OscarRyz

+3

Một NullPointerException là một lỗi. Một IllegalArgumentException là tốt hơn. – Horcrux7

+0

@ Horcrux7: Joshua Bloch không đồng ý với bạn và chuyển 'null' vào phương thức addCard ** là lỗi, như được ghi trong hợp đồng phương thức - thông qua câu lệnh @param" Không thể rỗng " –

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