2009-12-03 92 views
3

我有一類叫做技術員ArrayList的使用對象不保存值

public class Technician { 
    private String empLName; 
    private String empFName; 
    private int empId; 
    //I skipped all setters and getters  
    } 

在其他I類檢索所有的技術人員名稱,並將其加載到數組列表。

Technician empl = new Technician(); 
    ArrayList <Technician> employees = new ArrayList<Technician>(); 
    //...skip code related to database 
    // rs is ResultSet 

     while (rs.next()){ 

      empl.setEmpFName(rs.getString("EMP_LNAME")); 
      empl.setEmpLName(rs.getString("EMP_FNAME")); 
      empl.setEmpId(rs.getInt("EMP_ID")); 
      employees.add(empl); 
     } 

當我調試我看到從數據庫中檢索正確的值。 在while循環的第一次迭代中,我的empl對象獲得值 數據庫中的第一名員工,並將其存儲在員工ArrayList中。 在第二次迭代中,員工ArrayList中的第一個對象被第二個員工的值覆蓋。因此,我的ArrayList中有兩名僱員具有相同的姓氏,名字。 在第三次迭代中,員工ArrayList中的兩名員工的相同故事將被來自數據庫的第三名員工的 值覆蓋。

如果有任何建議如何解決我的代碼,我將不勝感激。 謝謝,

+1

+2,如果可以的話,發佈完美的* clean *代碼! –

回答

11

您需要在while循環內重新實例化empl。

你的代碼的問題是,empl是一個引用類型。它指向一塊內存。設置empl屬性的值時,只需覆蓋存儲在該塊內存中的值,而不是創建新的內存來保存不同的值。 ArrayList只是持有N個單元,指向由empl引用的同一塊內存。

修復:

while (rs.next()){ 
    Technician empl = new Technician(); 
    empl.setEmpFName(rs.getString("EMP_LNAME"));   
    empl.setEmpLName(rs.getString("EMP_FNAME"));   
    empl.setEmpId(rs.getInt("EMP_ID"));   
    employees.add(empl); 
} 
+1

+1:不幸的是,這是一個常見的錯誤。 – Powerlord

+0

我自己也犯了同樣的錯誤很多次。 – Achilles

+0

似乎每個人都有相同的答案。 – Chris

2

您不斷變化和增加同一個實例到列表中。您需要在每個循環創建一個新實例。

while (rs.next()) { 
    empl = new Technician(); 
    empl.setEmpFName(rs.getString("EMP_LNAME")); 
    empl.setEmpLName(rs.getString("EMP_FNAME")); 
    empl.setEmpId(rs.getInt("EMP_ID")); 
    employees.add(empl); 
} 
2

您每次都將相同的empl放入員工,然後更改每行的empl值。改爲:

ArrayList <Technician> employees = new ArrayList<Technician>(); 
    //...skip code related to database 
    // rs is ResultSet 

    while (rs.next()){ 
     Technician empl = new Technician(); 

     empl.setEmpFName(rs.getString("EMP_LNAME")); 
     empl.setEmpLName(rs.getString("EMP_FNAME")); 
     empl.setEmpId(rs.getInt("EMP_ID")); 
     employees.add(empl); 
    } 
2

發生這種情況的原因是因爲每次循環訪問數組時,empl都是相同的引用。相反,你必須初始化一個新的empl對象。

Technician empl = new Technician(); 
    ArrayList <Technician> employees = new ArrayList<Technician>(); 
    //...skip code related to database 
    // rs is ResultSet 

     while (rs.next()){ 
      empl = new Technician(); 
      empl.setEmpFName(rs.getString("EMP_LNAME")); 
      empl.setEmpLName(rs.getString("EMP_FNAME")); 
      empl.setEmpId(rs.getInt("EMP_ID")); 
      employees.add(empl); 
     }