Java强制转换异常一直随机出现(第一次可以强制转换,第二次不能)
总而言之,它不能第二次强制转换(@System.out.println(c.get(0.getClass());请注意细节Java强制转换异常一直随机出现(第一次可以强制转换,第二次不能),java,casting,classcastexception,Java,Casting,Classcastexception,总而言之,它不能第二次强制转换(@System.out.println(c.get(0.getClass());请注意细节 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to. 无论obj是Worker的实例,都会尝试将obj强制转换为Worker 将强制转换移到if语句块中。因此,在一天之后再次出现,并重新启动了几次所有操作(我当时非常绝望)。现在一切都正常了。这不是我第一次遇到这种情况(可能是垃圾收集器等
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to.
无论obj是Worker的实例,都会尝试将obj强制转换为Worker
将强制转换移到if语句块中。因此,在一天之后再次出现,并重新启动了几次所有操作(我当时非常绝望)。现在一切都正常了。这不是我第一次遇到这种情况(可能是垃圾收集器等)
感谢大家的努力:)当您忽略与泛型相关的编译器警告时,可能会出现神秘的类异常。打开所有编译器警告,并确保解决它们。特别是,不要使用原始类型(例如没有泛型类型的
List
),也不要调用使用或返回原始类型的方法
通过正确使用泛型,您的方法可以缩短为:
if (obj instanceof Worker) {
System.out.println("it's a worker");
}
Workerentity = (Worker) obj;
受保护列表查询(字符串条件){
字符串queryString=“FROM Worker”;
System.out.println(“添加到查询”);
if(条件!=null){
查询字符串+=“”+条件;
系统输出打印项次(条件);
}
System.out.println(“添加到查询”);
TypedQuery query=em().createQuery(queryString,Radnik.class);
System.out.println(“创建的查询”);
System.out.println(“开始查询”);
Listc=query.getResultList();
System.out.println(c.size());
Listresult=new ArrayList();
对于(Radnik obj:c){
结果.添加(EntityToBean(obj));
}
返回结果;
}
请注意使用的而不是查询
只要您的代码不生成编译器警告,一般类型的列表就保证包含正确类型的对象,因此无需检查结果列表的有效性。所以要更新,我有一个对象列表,因为它没有明确说明我应该选择什么,而且FROM部分有多个表!:dummy不需要
if(c instanceof List){
,因为这是由API.而不是System.out.println(c.get(0.getClass());
来保证的。你不想打印System.out.println(o.getClass());
。我确信在第二次调用时,数据(List)将不一样。工人与Radnik有什么关系?你的想法是什么出现错误时传递的“某些参数”?这很可能是问题的关键,因为这是有效查询和无效查询之间的区别。请将此信息放入问题中。您的情况很可能是添加了另一个将从查询返回的别名(结果变为对象[]
类型,而不是工作者
)。解决方案是将SELECT
放在FROM
之前,以确定您希望从查询中返回的内容:SELECT x FROM Worker x
虽然它打印的是一个Worker,但即使演员阵容在里面,如果我在它不是Worker时抛出例外添加一个else打印,您会惊讶地发现自己正在尝试把一个非工人变成工人。不要责怪可怜的GC…我很抱歉GC我错了,我是一个坏人!是的,这看起来是一个不错的答案,但我参与的项目不是这样的,所以我没有键入查询,但肯定是一个正确的答案。。。
if (obj instanceof Worker) {
System.out.println("it's a worker");
}
Workerentity = (Worker) obj;
protected List<WorkerBean> query(String condition) {
String queryString = "FROM Worker";
System.out.println("adding to query");
if (condition != null) {
queryString += " " + condition;
System.out.println(condition);
}
System.out.println("added to query");
TypedQuery<Radnik> query = em().createQuery(queryString, Radnik.class);
System.out.println("created query");
System.out.println("starting query");
List < Radnik > c = query.getResultList();
System.out.println(c.size());
List < WorkerBean > result = new ArrayList < WorkerBean > ();
for (Radnik obj: c) {
result.add(EntityToBean(obj));
}
return result;
}