有人可能遇到這樣的錯誤,明明在類中定義了某個成員變數,但是系統在啟動並執行時候提示錯誤:屬性XX沒有定義。這是什麼原因呢?
大家知道成員變數有多種存取控制符,通常都應該把成員變數定義成私人的,然後為該成員變數提供set方法和get方法,外界通過set方法和get方法對成員變數進行操作。這樣對外界來說,只有能夠訪問到的成員變數才算是屬性,例如下面的代碼:
private String userName;
public void setUserName(String userName){
this.userName = userName;
}
public String getUserName(){
return userName;
}
這時候我們說當前類有userName屬性,注意要區分大小寫。
另外還有一點非常重要,屬性的名字不是由成員變數決定的。通常set方法和get方法的名字是set或者get加上成員變數的名字,成員變數的首字母要變成大寫。而屬性的名字是什麼了,其實屬性的名字就是去掉set或者get,然後把首字母變成小寫。從這兩個命名規則可以看出,通常屬性名稱與成員變數的名字是一致的。但是,如果在寫set方法和get方法的時候,沒有按照預設的規則寫,則屬性名稱字和成員變數名字就一樣了。看下面的例子:
private String userName;
public void setUsername(String userName){
this.userName = userName;
}
public String getUsername(){
return userName;
}
在上面的代碼中,只修改了方法的名字(大寫的N變成小寫n),這時候屬性的名字已經由userName變成username了。如果要按照屬性名稱字訪問而不是直接存取get方法(例如,運算式語言),或者由架構自動完成屬性的賦值(例如,對於WebWork,需要在Action中需要定義與表單元素相同名字的屬性,對於Struts1,需要在ActionForm中定義與表單元素相同名字的屬性),這時候就必須寫username而不是userName,否則就抱錯,就是本文開頭所說的錯誤。
如果出現這樣的錯誤,首先查看有沒有定義set方法或者get方法,然後看看方法名字是否寫的正確。