5

日食で非常に奇妙な問題が発生しています。次のコードを見てください。

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 ループでは、オブジェクトのインスタンス タイプがチェックされ、それに応じてレイアウトに追加されます。

私が経験している問題は、オブジェクトがタイプの場合、 if ステートメントIntegerに入り、ステートメント内の2つの行を実行し、ループ内の新しいサイクルを離れる代わりに、elseステートメントにジャンプして行を実行することです(else ステートメントの最初の行をスキップします)。columnList.get(1).addComponent(hLayout)

すでに 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

コードが次のようになっている場合:

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)この場合、最初の行のみが条件の対象と見なされ、2番目の行が常に評価されます。

それがあなたが説明していることを引き起こすと私が考えることができる唯一のことです。IDEで見ているコードが、実行されているものとまったく同じであると確信していますか?たとえば、複数のJARに同じパッケージと名前のクラスがある場合、そのクラスは古いバージョンのクラスを使用している可能性があります。

于 2012-05-30T16:00:25.423 に答える
2

Eclipse Indigo でこの動作を見てきました。Eclipse がソース コードと同期していないことが問題のようです。「クリーン」では問題は解決しませんでした。それを修正するために、 if ステートメントの条件を変更し、再構築し、デバッグしてから、undo を使用せずに if ステートメントを元の状態に戻しました。

于 2012-05-30T16:07:31.970 に答える
0

おそらく、関数addItem()自体が2回呼び出されています。rowCount自分自身がの外で定義されていることに気づきましaddItemた。forループの外側で変数をインクリメントする場合は、その変数などを呼び出して、forループの前にint callCount実行callCount++します。

addItem2回呼び出されるので、2にインクリメントされると思います

于 2012-05-30T16:24:42.227 に答える
0

addItemシングルを作成しSHorizontalLayout、ループはそれにコンポーネントを追加し、同じレイアウトオブジェクトをの複数のコンテナに追加する可能性がありますcolumnList。それがあなたが望むものであると確信していますか?

たとえば、上記のコードで、objectListsパラメータにIntegerChipSlotGridがこの順序で含まれている場合、メソッドは、を作成しSHorizontalLayout、それにInteger'sコンポーネントを追加し、列0にレイアウトオブジェクトを追加し、ChipSlotGrid'sコンポーネントをに追加します。レイアウトしてから、同じレイアウトオブジェクトを列1に追加します。

これが私が使用した他のレイアウトフレームワークのようなものである場合、レイアウトオブジェクトを列1コンテナーに追加すると、列0コンテナーから削除されますが、IntegerコンポーネントとChipSlotGrid以前に追加されたコンポーネントの両方が含まれている可能性があります。ifステートメントの両方のブランチが実行されたように見えます。

これが実際に発生している問題を引き起こしているかどうかを確認するのに十分なコードが提供されていませんが、問題である可能性があります。

于 2012-05-30T16:15:58.050 に答える