一个简单的for循环的怪异bug

时间:2014-04-22 03:23:37

标签: java for-loop

我目前正在尝试阅读这个XML文件(请注意,为简单起见,我简化了XML):

<Users>
<User id="1" name="NY-01" location="New York">
<Hosts>
    <Host>
       <Host_Name>val9</Host_Name>
    </Host>
    <Host>
       <Host_Name>td8</Host_Name>
    </Host>
</Hosts>
</User>
</Users>

我使用JAXB库来读取它。

基本上我做了一个循环:

List<DataVal> l = new ArrayList<DataVal>();

for (int i = 0; i < data.getUsers().size(); i++) {
    DataVal pc = new DataVal();
    pc.setUser_id(data.getUsers().get(i).getId().toString());
    pc.setUser_name(data.getUsers().get(i).getName());
    pc.setUser_location(data.getUsers().get(i).getLocation());

    for (int j = 0; j < data.getUsers().get(i).getHosts().getHost().size(); j++) {
        pc.setHost_name(data.getUsers().get(i).getHosts().getHost().get(j).getHostName());
        System.out.println(pc);
        l.add(pc);
    }
}   

请注意,当我在添加到列表之前执行System.out.println(pc)时,pc的值是正确的;

但是当我打印出ArrayList&#34; l&#34;在这段代码之后,我得到host_name td8两次而不是val9和td8作为下一个。 id,name,location values尽管是正确的。

为什么会这样?

这是打印列表的代码:

for (int q = 0; q < l.size(); q++) {
    System.out.println(l.get(q)); // I have a toString implementation of this...
}

编辑:在使用eclipse进行调试之后,由于某种原因,在j循环的每次迭代之后,值都会变为host_name的最后一个循环值...

1 个答案:

答案 0 :(得分:2)

好像你正在每次传递时替换pc.setHost_name,这意味着你的主机名值将等于主机的最后读数。

如果它们需要区分,这意味着您需要在主机循环内创建DataVal对象,而不是用户循环。