class cast exception:java.lang.String与[Ljava.lang.Object;不兼容;

时间:2011-11-17 11:06:35

标签: java string list object casting

以下代码有什么问题?

List<Object[]> currencies = null;
List<String> currencyList = new ArrayList<String>();

//code to fetch currency
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);

currencies = currencyQuery.getResultList();

for (Object[] currency : currencies) {    //getting runtime error here
   for (int i = 0; i < currency.length; i++) {
            currencyList.add(currency[i].toString());
        }
    }

在for循环的第一行中获取运行时错误:     java.lang.ClassCastException:java.lang.String与[Ljava.lang.Object;

不兼容

代码编译正常。

问题是什么?

4 个答案:

答案 0 :(得分:2)

我不确定您为什么认为Query会返回Object数组的列表。

查询很可能返回String的列表(除非Currency实体包含Currency对象,在这种情况下我会重新访问数据设计),因此在假设这是标量的情况下运行查询,您的代码可以简化为:

String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);

List<String> currencyList = (List<String>) currencyQuery.getResultList();

答案 1 :(得分:0)

之后检查调试器中的货币变量
currencyQuery.getResultList();

可能它不是Object []的列表,而是字符串列表。

答案 2 :(得分:0)

问题是currencyList应该是List类型而不是List<Object[]>类型。这也意味着循环中的currency变量应该是Object类型,因此它实际上与String兼容(异常来自的地方)。然后,您需要验证是否有字符串。

或者,您在SQL中获得了足够的信息,以确保结果真的是List<String>,这反过来又允许您将currency声明为{{1}类型}}。但这将涉及一个正式不安全的演员;这将是一个你知道它是正确的地方,但编译器没有,所以你会得到一个警告。这将是一个适当的地方来抑制警告(只是在那一个任务/演员;你想试图避免抑制警告,因为这可以掩盖严重的问题)。

答案 3 :(得分:0)

我认为您从查询中获取货币列表存在问题。你不需要创建另一个数组。试试这个

List<String> currencyList = new ArrayList<String>();

//code to fetch currency
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);

currencies = currencyQuery.getResultList();

for (String currency : currencies) {    
    currencyList.add(currency);
}