[英]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.