【问题标题】:How to resolve exception java.lang.ClassCastException: java.math.BigDecimal cannot be cast to [Ljava.lang.Object; in java如何解决异常 java.lang.ClassCastException:java.math.BigDecimal 无法转换为 [Ljava.lang.Object;在java中
【发布时间】:2016-05-01 17:40:44
【问题描述】:

在我的代码中,query 工作正常,但在迭代时会引发此错误。

我的代码在这里:

Session session = null;
try{
    Query qu=session.createSQLQuery("select plot_no from house_details where type='duplex'");
    List<Long> li =  qu.list();
    System.out.println("---li---"+li.toString());
    for (Iterator itr = li.iterator(); itr.hasNext();) {
        String plotNo = itr.next().toString();

        if(plotNo.equals("501") || plotNo.equals("520") || plotNo.equals("601"){
            System.out.println("---if---");
            //code here
        }
        else{
            System.out.println("---else---");
            Query qu1 = session.createSQLQuery("select distinct name,houseno from house_details");
            List li1 =  qu1.list();
            for (Iterator itr1 = li.iterator(); itr1.hasNext();) {
                Object[] obj = (Object[]) itr1.next();
                String houseName = (String) obj[0];
                String houseNo = (String) obj[1];
                System.out.println("---houseName--->"+houseName);
            }
    }
}catch(Exception e){
   e.printStackTrace();

}finally {
   if(session!=null){
    session.close();
   }
}

输出:

---li---[501, 0, 101, 101, 114]
---else---
java.lang.ClassCastException: java.math.BigDecimal cannot be cast to [Ljava.lang.Object;

它在Object[] obj = (Object[]) itr1.next(); 行中显示错误。

我的代码有什么问题?

【问题讨论】:

    标签: java casting classcastexception


    【解决方案1】:

    首先,演员表:您将列表li 上的迭代器视为数组列表上的迭代器,而实际上它是BigDecimals 列表上的迭代器。你应该迭代的是li1:

    for (Iterator itr1 = li1.iterator() ; itr1.hasNext() ; )
    //                     ^
    

    另一个错误发生在早期:

    List<Long> li =  qu.list();
    

    应该是

    List<BigDecimal> li =  qu.list();
    

    因为您的查询返回的列表中的对象属于 BigDecimal 类型,正如失败的强制转换所证实的那样。

    【讨论】:

    • 我有 101 两次,它也进入 else 循环两次,如何停止它我只想要一次是够了。
    • @Sri select distinct plot_no 在第一个查询中应该可以解决问题。
    • 谢谢你,它工作正常,但有些场景我得到了 501, 520, 601 值,这些值正在检查 if ** 条件,所以 **if 循环执行 3 次,在这种情况下,任何可能只执行一次 if 条件
    • @Sri 在循环之前添加一个boolean enteredIf变量,并将其设置为false。将条件更改为if (!enteredIf &amp;&amp; (plotNo.equals("501") || plotNo.equals("520") || plotNo.equals("601"))),并在条件内将enteredIf 设置为true。这样你就只处理一次if,其他时候你会去else分支。
    • 我写 boolean enteredIf=false; if (!enteredIf && (plotNo.equals("501") || plotNo.equals("520") || plotNo.equals("601"))){enteredIf=true; //我的代码 } 这个过程正确吗?但我的 输出 没有变化
    【解决方案2】:

    正如错误所说:单个 BigDecimal 不能转换为 Object-Array。 您有错误的列表要迭代:li li1。 将for (Iterator itr1 = li.iterator(); itr1.hasNext();) { 更改为(Iterator itr1 = li1.iterator(); itr1.hasNext();) {,然后它应该可以工作了。

    【讨论】:

    • 我得到了 101 两次,它也进入 else 循环两次,如何停止它我只想要一次是够了
    • 在您的第一个查询中添加一个“distinct”。喜欢select distinct plot_no from...
    • 一些场景我得到了 501、520、601 值,这些值在 if ** 条件中检查,所以 **if 循环执行三次,在这种情况下执行的任何可能性如果条件只有一次
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2016-09-05
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多