簡體   English   中英

為什么我的例外不起作用

[英]Why my exception doesn't work

如果輸入的客戶名稱為null,則應該引發異常,但是我的代碼無效。

public class CustomerAccount {
    private String name;

    public CustomerAccount(String name) throws IllegalArgumentException {

        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) throws IllegalArgumentException {
        try {
            this.name = name;

        }

        catch (IllegalArgumentException illegal) {
            if (name == "" || name == null) {
                System.err.println("please do not enter the empty string" + illegal);
            }

        }
    }

    public String toString() {
        return "Name: " + this.getName();
    }

    public static void main(String[] args) {
        CustomerAccount c1 = new CustomerAccount("random name");

        c1.setName(null);
        System.out.println(c1);
    }
}

如果名稱為null或為空(在該方法內不能進行try / catch),則setName應該僅引發IllegalArgumentException。

public void setName(String name) throws IllegalArgumentException {
   if ("".equals(name) || name == null) {
    throw new IllegalArgumentException("Name should not be null or empty");
   }
   this.name=name;

 }

使用name.equals("")
最好使用equals()進行字符串比較。

僅分配空值不會觸發異常!

此外,本着快速失敗的精神,方法參數驗證通常是在方法實現中首先完成的。 另外, name == ""不太可能起作用,因為name可能是在運行時設置的,因此將不同的內存地址指定為"" 最后但並非最不重要的一點是,約定要求使用NullpointerException而不是IllegalArgumentException (請參見有效的Java項目60)。

加所有這些,您可以實現如下方法:

public void setName(@Nonnull final String name) {

  if (name == null || name.length() == 0) {
    throw new NullPointerException("[name] must not be null or empty.");
  } 

  this.name = name;
}

由於這是一種檢查,因此您可能會在代碼中執行很多次,因此建議使用庫函數進行檢查:

用番石榴:

Preconditions.checkArgument(name != null && name.length() > 0, "[name] must not be null or empty.");

使用Apache Commons:

if (StringUtils.isEmpty(name)) {
  throw new NullPointerException("[name] must not be null or empty.");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM