十、java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to xxx.action.entity.Category

本文介绍了一种常见的Java运行时异常——ClassCastException,并提供了解决该异常的具体步骤。当使用Hibernate进行多表连接查询时,如果返回的数据类型与预期不符,则可能会遇到此问题。文章详细解释了如何调整代码以确保数据类型的正确转换。
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to xxx.action.entity.Category
	at chentailei.action.test.SSH_CategoryDao.findByParentId(SSH_CategoryDao.java:61)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
	at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
	at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
	at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
	at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
	at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
	at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


原因:

界面输出标签如:${categorys.name},需要的是:List<Category>,而HIbernate回调函数返回的是Object[],两者予盾。

解决:

1.将输出类型List<Category>,变更为:List<Object[]>,变更页面输出${categorys[1]},详细对比数组元素的位置;

2.将回调函数返回的Object[],强转为:List<Object[]>(不能强转为 List<Category>,因为SQL语句是多表连接查询,执行后会报上述错误),然后再遍历,通过Category对象赋值(即将 Object[]的元素值赋予Category属性),再添加至List<Category>,转换代码如下:

//执行回调对象,获取结果集
List<Object[]> list =
 (List)this.getHibernateTemplate().execute(action);
//转换
List<Category> prolist = new ArrayList<Category>();
for(int i=0; i<list.size(); i++){
 Object[] obs=list.get(i);
 Category cate = new Category();
 cate.setId((Integer)obs[0]);
 cate.setTurn((Integer)obs[1]);
 cate.setName((String)obs[2]);
 cate.setEnName((String)obs[3]);
 cate.setDescription((String)obs[4]);
 cate.setParentId((Integer)obs[5]);
 cate.setPnum((BigInteger)obs[6]);
 prolist.add(cate);
}


Java 中,当出现 `java.lang.ClassCastException: [Ljava.lang.Long; cannot be cast to java.lang.Long` 错误时,表示尝试将一个 `Long[]` 类型的数组强制转换为单个 `Long` 对象,这在 Java 中是不允许的,因为数组和单个对象属于不同的数据结构,不具备直接的类型兼容性。 ### 原因分析 该异常通常出现在以下几种场景中: - 从集合或缓存中取出数据时,误将数组当作单个对象使用。 - 使用泛型不当,导致类型信息丢失,运行时进行强制类型转换时出错。 - 反序列化或解析数据结构时,未正确处理数组与对象的类型差异。 例如,以下代码会抛出该异常: ```java Object obj = new Long[]{1L, 2L}; Long value = (Long) obj; // 抛出 ClassCastException ``` ### 解决方法 #### 方法一:检查数据来源并正确转换 如果数据来源于缓存、集合或泛型结构,应首先确认其实际类型,并进行相应处理: ```java Object obj = cache.get("key"); if (obj instanceof Long[]) { Long[] array = (Long[]) obj; // 处理数组 } else if (obj instanceof Long) { Long value = (Long) obj; // 处理单个值 } ``` #### 方法二:避免错误的类型转换 确保在存储和读取数据时保持类型一致性。例如,在使用缓存框架时,明确指定泛型类型,避免将数组和对象混用: ```java Cache<String, Long> cache = Caffeine.newBuilder().build(); cache.put("key", 1L); Long value = cache.getIfPresent("key"); // 正确获取 Long 对象 ``` #### 方法三:处理集合或数组的转换逻辑 如果确实需要将数组转换为集合或处理其中的元素,应使用遍历或流操作: ```java Object obj = new Long[]{1L, 2L}; if (obj instanceof Long[]) { Long[] array = (Long[]) obj; List<Long> list = Arrays.asList(array); // 继续处理 list } ``` #### 方法四:使用 Optional 避免空指针 在处理缓存或可能为空的对象时,可以结合 `Optional` 提高代码健壮性: ```java Optional.ofNullable(cache.get("key")) .map(obj -> { if (obj instanceof Long) { return (Long) obj; } else if (obj instanceof Long[]) { return ((Long[]) obj)[0]; // 取第一个元素作为示例 } return null; }) .ifPresent(value -> { // 使用 value }); ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值