Java cast异常一直随机出现(先能cast,后不能)
Java cast exception keeps randomly appearing(first it can cast, after it cant)
protected List 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");
Query query = em().createQuery(queryString);
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 > ();
System.out.println("before for");
if (c instanceof List <? > ) {
System.out.println("YES!");
for (Object obj: c) {
System.out.println("entered!!!");
System.out.println(c.get(0).getClass());
if (obj instanceof Worker) {
System.out.println("it's a worker");
}
Workerentity = (Worker) obj;
result.add(EntityToBean(entity));
}
c.clear();
System.out.println("out of for");
}
return result;
}
所以困扰我和办公室里所有其他人的事情是,在第一次调用这个查询时它没有问题(完整的工作人员列表),但是当我第二次调用时(与一些参数)它说列表大小符合我的预期但抛出
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to.
所以综上所述无法进行第二次投射(@System.out.println(c.get(0).getClass());
考虑注意细节。
if (obj instanceof Worker) {
System.out.println("it's a worker");
}
Workerentity = (Worker) obj;
无论 obj 是 Worker 的实例,都会尝试将 obj 转换为 Worker。
将强制转换移到 if 语句块内。
所以一天后又来了,然后重新启动了几次(我当时很绝望)。现在一切正常。这不是第一次发生在我身上(可能是一些垃圾收集器等)
谢谢你们的努力:)
当您忽略与泛型相关的编译器警告时,往往会发生神秘的 ClassCastExceptions。打开所有编译器警告,并确保解决它们。特别是,不要使用原始类型(例如没有通用类型的 List
),也不要调用使用或 return 原始类型的方法。
通过正确使用泛型,您的方法可以缩短为:
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;
}
注意使用 TypedQuery 而不是查询。
只要您的代码不生成编译器警告,一般类型的列表就保证包含正确类型的对象,因此无需检查结果列表的有效性。
所以要更新,我有一个对象列表,因为它没有具体说明我应该 select,并且 FROM 部分有多个表! :虚拟
protected List 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");
Query query = em().createQuery(queryString);
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 > ();
System.out.println("before for");
if (c instanceof List <? > ) {
System.out.println("YES!");
for (Object obj: c) {
System.out.println("entered!!!");
System.out.println(c.get(0).getClass());
if (obj instanceof Worker) {
System.out.println("it's a worker");
}
Workerentity = (Worker) obj;
result.add(EntityToBean(entity));
}
c.clear();
System.out.println("out of for");
}
return result;
}
所以困扰我和办公室里所有其他人的事情是,在第一次调用这个查询时它没有问题(完整的工作人员列表),但是当我第二次调用时(与一些参数)它说列表大小符合我的预期但抛出
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to.
所以综上所述无法进行第二次投射(@System.out.println(c.get(0).getClass());
考虑注意细节。
if (obj instanceof Worker) {
System.out.println("it's a worker");
}
Workerentity = (Worker) obj;
无论 obj 是 Worker 的实例,都会尝试将 obj 转换为 Worker。
将强制转换移到 if 语句块内。
所以一天后又来了,然后重新启动了几次(我当时很绝望)。现在一切正常。这不是第一次发生在我身上(可能是一些垃圾收集器等) 谢谢你们的努力:)
当您忽略与泛型相关的编译器警告时,往往会发生神秘的 ClassCastExceptions。打开所有编译器警告,并确保解决它们。特别是,不要使用原始类型(例如没有通用类型的 List
),也不要调用使用或 return 原始类型的方法。
通过正确使用泛型,您的方法可以缩短为:
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;
}
注意使用 TypedQuery 而不是查询。
只要您的代码不生成编译器警告,一般类型的列表就保证包含正确类型的对象,因此无需检查结果列表的有效性。
所以要更新,我有一个对象列表,因为它没有具体说明我应该 select,并且 FROM 部分有多个表! :虚拟