尝试遍历列表时抛出Java ClassCastException

时间:2014-11-06 10:50:38

标签: java classcastexception

我的代码在运行时失败并显示ClassCastException。我试图调试但是徒劳无功。我已经使用字段声明了一个Class Subject,并且我正在尝试将该类的对象加载到列表中。下面是代码。它失败了:List items = (List)(it.next())。为泛型添加?无济于事。我猜对象是强制转换的,尽管List声明中没有提到泛型。我有一个基本的概念吗?

在下面的方法中,我尝试将数据编码为xml文件。

 private void encodeSection(PrintStream output, Indenter indenter,
                                   String name, List list) {
            String indent = indenter.makeString();

            output.println(indent + "<" + name + "s>");

            indenter.in();
            String indentNext = indenter.makeString();

            if (list == null) {
                // the match is any
                output.println(indentNext + "<Any" + name + "/>");
            } else {
                String nextIndent = indenter.makeString();

                Iterator it = list.iterator();
                indenter.in();

                while (it.hasNext()) {
                  List items = (List)(it.next());//-------------> Error occurs
                    output.println(indentNext + "<" + name + ">");

                    Iterator matchIterator = items.iterator();
                    while (matchIterator.hasNext()) {
                        TargetMatch tm = (TargetMatch)(matchIterator.next());
                        tm.encode(output, indenter);
                    }

                    output.println(indentNext + "</" + name + ">");
                }

                indenter.out();
            }

            indenter.out();
            output.println(indent + "</" + name + "s>");
        }

    }

堆栈追踪:

Exception in thread "main" java.lang.ClassCastException: SubjectID_V cannot be cast to java.util.List
    at Target_V.encodeSection(Target_V.java:71)
    at Target_V.encode(Target_V.java:41)
at com.sun.xacml.AbstractPolicy.encodeCommonElements(Unknown Source)
    at com.sun.xacml.PolicySet.encode(Unknown Source)
    at PolicyFactory_V.main(PolicyFactory_V.java:56)

1 个答案:

答案 0 :(得分:2)

List items = (List)(it.next())仅在您迭代的List仅包含List类型的元素(即实现List接口的类的实例)时才有效。

根据您获得的错误,您尝试将SubjectID_V类型的实例强制转换为List。您应该查看初始化该列表的代码。您的错误可能就在那里。

使用泛型列表可能有助于避免此异常,因为它会阻止代码首先通过编译。