0

メソッドからオブジェクトコレクションとして返される特定のオブジェクトを変更しようとしています。現在、他の多くのオブジェクトもこのコレクションに追加されています。したがって、特定のオブジェクトを見つけるのは困難になります。「instanceof」を使用して解決しようとしましたが、次の例外が発生します。

java.lang.ClassCastException: com.sheesoft.MockBean cannot be cast to com.sheesoft.TestBean
at com.sheesoft.Main.main(Main.java:30)

いくつかのテストクラスで同じ例外を再現することができました。どこが悪いのか教えてください。

主要:

package com.sheesoft;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {
    Collection<Object> beanCollection = new ArrayList<Object>();
    TestBean tb1 = new TestBean();
    MockBean mb1 = new MockBean();

    beanCollection.add(tb1);
    beanCollection.add(mb1);

    try{
    Iterator<Object> itr = beanCollection.iterator();
    while(itr.hasNext()){
        Object object = itr.next();
        if(object instanceof TestBean){
            TestBean tb2 = (TestBean) itr.next();
            tb2 = modifyTestBody(tb2);
            System.out.println(tb2.getBody());
        }
        if(object instanceof MockBean){
            MockBean mb2 = (MockBean) itr.next();
            System.out.println(mb2.getMockPayload());
        }
    }
    }catch(Exception e){
        e.printStackTrace();
    }
}

    private static TestBean modifyTestBody(TestBean tb) {
    tb.setBody("NewBody");
            return tb;
    }

}

Bean1:

package com.sheesoft;

public class TestBean {
private String header;
private String body;

public TestBean(){
    setHeader("header");
    setBody("body");
}

public String getHeader(){
    return header;
}
public String getBody(){
    return body;
}
public void setHeader(String header){
    this.header=header;
}
public void setBody(String body){
    this.body = body;
}
public String toString(){
    StringBuilder sb = new StringBuilder();
    sb.append("header = "+header+"\n");
    sb.append("body = "+body+"\n");
    String returns = sb.toString();
    return returns;
}
}

Bean 2:

package com.sheesoft;

public class MockBean {
private String mockHeader;
private String mockBody;
private String mockPayload; 

public MockBean(){
    setMockHeader("mockHeader");
    setMockBody("mockBody");
    setMockPayload("mockPayload");
}



public String getMockHeader(){
    return mockHeader;
}
public String getMockBody(){
    return mockBody;
}
public String getMockPayload(){
    return mockPayload;
}
public void setMockHeader(String header){
    this.mockHeader=header;
}
public void setMockBody(String body){
    this.mockBody = body;
}
public void setMockPayload(String payload) {
    this.mockPayload = payload;
}

public String toString(){
    StringBuilder sb = new StringBuilder();
    sb.append("mockHeader = "+mockHeader+"\n");
    sb.append("mockBody = "+mockBody+"\n");
    sb.append("mockPayload"+mockPayload+"\n");
    String returns = sb.toString();
    return returns;
}
}
4

3 に答える 3

1

    System.out.println(itr.next().toString());
    if(itr.next() instanceof TestBean){
        TestBean tb2 = (TestBean) itr.next();
                        tb2=modifyTestBody(tb2);
        System.out.println(tb2.getBody());
    }
    if(itr.next() instanceof MockBean){
        MockBean mb2 = (MockBean) itr.next();
        System.out.println(mb2.getMockPayload());
    }

あなたはitr.next()3回別々に電話します。利用可能な要素が1 つしかないかどうかを確認しただけの場合は、3 つの異なる要素を移動します。代わりに、変数に格納し、その変数に対してすべての操作を行います。itr.next()

于 2013-01-30T18:22:44.827 に答える
1

あなたのコードで:

System.out.println(itr.next().toString());
        if(itr.next() instanceof TestBean){
            TestBean tb2 = (TestBean) itr.next();
                            tb2=modifyTestBody(tb2);
            System.out.println(tb2.getBody());

あなたはすでにitr.next()3 回電話をかけています。したがって、u が 3 番目に書いた時点で、itr.next()すでに 3 番目の要素にジャンプしています。したがって、各ループでは、代わりに 3 つの要素を反復しています。したがって、Iterator時期尚早に使い果たされ、スローされますjava.util.NoSuchElementException

EDIT 代わりにこのコードを使用してください:

while(itr.hasNext()){
        Object obj = itr.next();
        System.out.println(obj.toString());
        if(obj instanceof TestBean){
            TestBean tb2 = (TestBean) obj;
                            tb2=modifyTestBody(tb2);
            System.out.println(tb2.getBody());
        }
        if(obj instanceof MockBean){
            MockBean mb2 = (MockBean) obj;
            System.out.println(mb2.getMockPayload());
        }
    }
    }catch(Exception e){}
于 2013-01-30T18:28:20.590 に答える
0

あなたが持っているコードで

    System.out.println(itr.next().toString());
    if(itr.next() instanceof TestBean){
        TestBean tb2 = (TestBean) itr.next();
....

問題は、itr.next() を呼び出すたびにコレクションから次のオブジェクトを取得することです。その場合、1 つではなく複数のオブジェクトを取得します。

このコードを次のように変更する必要があります。

    Object object = itr.next();
    System.out.println(object.toString());
    if(object instanceof TestBean){
        TestBean tb2 = (TestBean) object;
....
于 2013-01-30T18:23:40.600 に答える