2013-02-13 109 views
1

當我有兩個類如以下的NullPointerException錯誤使用模型驅動

Address 
    int ID 
    int unit 
    String street 

User 
    int ID 
    String Name 
    Address address 

我的用戶類

public class user{ 
    ..... 
    private Address address; 
    ...getters setters... 
} 

如以上那樣,用戶類中有地址類的一個對象。我的代碼預計會接收表單的值並在控制檯上顯示它們。

但是,當我嘗試訪問地址類的單位屬性時,它顯示以下錯誤。

「嚴重:在異常處理要求時發生:空 顯示java.lang.NullPointerException」

我控制器

@Action 
class myclass implements ModelDriven{ 

    private User user = new User(); 

    public Register(){ 
     System.out.println("User's Unit" + user.getAddress().getUnit()); // error is on this line 
    } 
    @Override 
    public Object getModel() { 
     return user; 
    } 

JSP文件

<s:form action="Register"> 
      <s:textfield name="name" label="Name"/> 
      <s:textfield name="unit" label="Unit"/> 
      <s:textfield name="block" label="Block"/> 
</s:form> 
+0

到底在哪做你想使用你的OTHER類屬性? – SudoRahul 2013-02-13 04:08:19

+0

@ R.J我需要在我的控制器中訪問它們以將它們發送到我的模型以保存在數據庫中。 – 2013-02-13 04:09:02

+0

** System.out.println(「User's Unit」+ user.getAddress()。getUnit()); ** - 您已經使用過它。你的問題仍然太模糊。 – SudoRahul 2013-02-13 04:15:16

回答

2

做到以下幾點隊友

<s:textfield name="address.unit" label="Unit"/> 
0

的問題,因爲我看到它是,你還沒有new d address對象

address = new Address();User類的構造函數中。

0

看起來像使用「private User user = new User()」創建用戶對象時,用戶的地址對象未初始化。 作爲user.getAddress()爲空,當您嘗試調用user.getAddress()。getUnit(),它會導致空指針異常

1
<s:textfield name="name" label="Name"/> 

這裏struts2將搜索name =「name」屬性在相應的DTO中各自的動作中,但值棧將無法在您的動作中找到名爲「name」的屬性,因爲您創建了不同的bean類Address這是成員「名稱」。 所以你必須告訴你的表單元素「名稱」實例駐留在不同的POJO ,即Adderess。所以作出這樣的改變:

<s:textfield name="address.name" label="name"/> 
2

嘗試這個動作類,這將definitly工作

public class myclass extends ActionSupport implements ModelDriven<User>, Preparable{ 

    private User user = new User(); 

@Override 
public void prepare() throws Exception { 
    user=new User(); 
} 

@Override 
public User getModel() { 
    return user; 
} 
public Register(){ 
    System.out.println("User's Unit" + user.getAddress().getUnit()); 
    } 
} 

,改變JSP

<s:textfield name="address.unit" label="Unit"/> 

設置唯一的單位屬性