2009-12-03 4 views
3

내가 모든 기술자의 이름을 검색하고 배열 목록에로드 다른 클래스에서 클래스라는 기술자의 ArrayList는 값이

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

를 보유하지 않습니다.

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 내가 할 수만 있다면 완벽하게 * 깨끗한 코드를 게시 할 수 있습니다! –

답변

11

while 루프 내에서 empl을 다시 인스턴스화해야합니다.

코드에 문제가있는 것은 empl이 참조 유형이라는 것입니다. 그것은 메모리 블록을 가리 킵니다. empl의 속성 값을 설정하면 다른 값을 저장하기 위해 새 메모리를 만드는 대신 해당 메모리 블록에 저장된 값을 덮어 쓰게됩니다. ArrayList는 단순히 empl이 참조하는 동일한 메모리 블록을 참조하는 N 개의 셀을 보유하고 있습니다.

수정 :

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); 
     }