5

我在eclipse中遇到了一个非常奇怪的问题。看下面的代码:

public void addItem(ArrayList<Object> objectLists)  {

        SHorizontalLayout hLayout = Cf.hLayout();
        hLayout.setSizeFull();
        hLayout.setHeight(rowHeight, UNITS_PIXELS);
        if(rowCount % 2 != 0 && rowCount != 0)  {
            hLayout.addStyleName("row-even");
        } else  {
            hLayout.addStyleName("row-odd");            
        }

        for(Object object : objectLists)    {

            if(object instanceof String || object instanceof Integer)   {
                hLayout.addComponent(Cf.h1(object.toString()), Alignment.MIDDLE_CENTER);
                columnList.get(0).addComponent(hLayout);                
            } else if(object instanceof ChipSlotGrid)   {
                hLayout.addComponent((ChipSlotGrid)object, Alignment.MIDDLE_CENTER);
                columnList.get(1).addComponent(hLayout);            
            }
        }

        rowCount++;
    }

在 for 循环中,检查对象的实例类型并相应地添加到布局中。

我遇到的问题是,当对象是 type 时,Integer它​​进入if 语句,执行语句内的两行,然后不是在循环中离开一个新的循环,而是跳转到 else 语句,执行 row columnList.get(1).addComponent(hLayout)(跳过 else 语句中的第一行)。

即使它已经进入了 if 语句,它也在执行 else 语句的一部分。我知道这一点是因为我在我正在开发的应用程序中看到了它的产品,并且在我调试代码时我已经以编程方式看到了它。

如果我要将问题分解为最小的组件:

i = 0;    
if(true)   {
   i++;
} else   {
   i++;
}

System.out.println(i);

对于我的问题,打印输出将是:2

我在这里不知所措。我的 IDE 有问题吗?有没有人遇到过这种情况并且知道可能出了什么问题?

编辑: 我尝试过切换语句并且可以得出结论该模式重复自身。

for(Object object : objectLists)    {

        if(object instanceof ChipSlotGrid)  {
            hLayout.addComponent((ChipSlotGrid)object, Alignment.MIDDLE_CENTER);
            columnList.get(1).addComponent(hLayout);                
        } else if(object instanceof String || object instanceof Integer)    {
                hLayout.addComponent(Cf.h1(object.toString()), Alignment.MIDDLE_CENTER);
                columnList.get(0).addComponent(hLayout);
        }
    }

编辑 2:根据 Jon 的请求,我在语句中添加了日志记录。

for(Object object : objectLists)    {

            if(object instanceof ChipSlotGrid)  {
                log.info("Inside if");
                hLayout.addComponent((ChipSlotGrid)object, Alignment.MIDDLE_CENTER);
                columnList.get(1).addComponent(hLayout);
            } else if(object instanceof String || object instanceof Integer)    {
                    log.info("Inside else");
                    hLayout.addComponent(Cf.h1(object.toString()), Alignment.MIDDLE_CENTER);
                    columnList.get(0).addComponent(hLayout);
            }
        }

当它从 if 语句跳转到 else 语句时,else 语句中的日志也会被跳过。(我希望这是你要求的测试)

4

4 回答 4

2

我已经在 Eclipse Indigo 中看到了这种行为。Eclipse 与您的源代码不同步似乎是一个问题。“干净”并没有为我解决问题。为了修复它,我只是更改了 if 语句的条件,重新构建、调试,然后将我的 if 语句更改回原来的方式,而不使用 undo

于 2012-05-30T16:07:31.970 回答
2

如果您的代码如下所示:

if(object instanceof String || object instanceof Integer)   {
    hLayout.addComponent(Cf.h1(object.toString()), Alignment.MIDDLE_CENTER);
    columnList.get(0).addComponent(hLayout);                
} else if(object instanceof ChipSlotGrid)   
    hLayout.addComponent((ChipSlotGrid)object, Alignment.MIDDLE_CENTER);
    columnList.get(1).addComponent(hLayout);            

(注意 上没有大括号else if)那么只有第一行将被视为受条件约束,而第二行将始终被评估。

这是我能想到的唯一会导致你解释的事情。您确定您在 IDE 中查看的代码正是正在执行的代码吗?例如,如果您在多个 JAR 中有一个具有相同包和名称的类,那么它可能使用的是该类的过时版本。

于 2012-05-30T16:00:25.423 回答
0

该函数addItem()本身很可能被调用了两次。我注意到rowCount它本身是在addItem. 如果您在 for 循环之外增加一个变量,请在 for 循环之前调用它int callCount或执行其他操作callCount++

我打赌它会增加到 2,因为addItem被调用了 2 次

于 2012-05-30T16:24:42.227 回答
0

addItem创建一个,SHorizontalLayout然后循环将组件添加到它,并将相同的布局对象添加到columnList. 你确定那是你想要的吗?

例如,使用上面编写的代码,如果objectLists参数按顺序包含 anInteger和 a ChipSlotGrid,该方法将创建一个SHorizontalLayout,将Integer' 组件添加到其中,将布局对象添加到第 0 列,将ChipSlotGrid' 组件添加到布局,然后将相同的布局对象添加到第 1 列。

如果这与我使用的其他布局框架类似,那么当您将布局对象添加到第 1 列容器时,它将从第 0 列容器中删除,但仍将包含之前添加的Integer组件和ChipSlotGrid组件,这可能看起来if语句的两个分支都已执行。

没有提供足够的代码让我看到这是否真的导致了您遇到的问题,但我怀疑这可能是一个问题。

于 2012-05-30T16:15:58.050 回答