Java强制转换异常一直随机出现(第一次可以强制转换,第二次不能)

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语句块中。因此,在一天之后再次出现,并重新启动了几次所有操作(我当时非常绝望)。现在一切都正常了。这不是我第一次遇到这种情况(可能是垃圾收集器等

总而言之,它不能第二次强制转换(@System.out.println(c.get(0.getClass());

请注意细节

 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;
}