如果和else声明在同一时间虽然它应该是不可能的

时间:2012-05-30 15:55:48

标签: java eclipse if-statement

我在日食中遇到了一个非常奇怪的问题。 请查看以下代码:

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循环中,检查对象的实例类型并相应地添加到布局中。

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

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

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

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 个答案:

答案 0 :(得分: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中具有相同的包和名称,那么它可能正在使用该类的过时版本。

答案 1 :(得分:2)

我在Eclipse Indigo中看到过这种行为。这似乎是Eclipse与源代码不同步的问题。 “清洁”并没有为我解决问题。为了解决这个问题,我只是改变了if语句的条件,重建,调试了然后将我的if语句改回了而不使用undo

答案 2 :(得分:0)

addItem创建一个SHorizontalLayout然后循环向其添加组件,并将相同的布局对象添加到columnList中的多个容器中。你确定那是你想要的吗?

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

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

没有提供足够的代码来告诉我这是否确实导致了您遇到的问题,但我怀疑这可能是一个问题。

答案 3 :(得分:0)

很可能函数addItem()本身被调用两次。我注意到rowCount本身是在addItem之外定义的。 如果在for循环之外增加一个变量,请将其称为int callCount或其他内容,并在for循环之前执行callCount++

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