- Details
-
Last Updated: 29 April 2014
-
Created: 29 April 2014
I had this class that I wanted to add a convenience method to. But I was getting this weird exception: VerifyError: Bad type on operand stack
.
The class in question is a JPA entity, I'm using Hibernate, and mind you that Hibernate uses a lot of stuff under the belt, such as Javassist. This convenience method seemed nothing special, but at some point it created an inline Comparator
class, such as:
@Entity
...
public class OpeningHours extends AbstractPersistedEntity {
...
public String getSummary() {
...
Collections.sort(days, new Comparator<OpeningHoursDay>() {
@Override
public int compare(OpeningHoursDay o1, OpeningHoursDay o2) {
return ObjectUtils.compare(o1.ordinal(), o2.ordinal());
}
});
...
This code was punished by an exception as follows:
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
com/totaalsoftware/incidentmanager/entity/OpeningHours$1.<init>(Lcom/totaalsoftware/incidentmanager/entity/OpeningHours;)V @2: invokevirtual
Reason:
Type uninitializedThis (current frame, stack[0]) is not assignable to 'com/totaalsoftware/incidentmanager/entity/OpeningHours$1'
Current Frame:
bci: @2
flags: { flagThisUninit }
locals: { uninitializedThis, 'com/totaalsoftware/incidentmanager/entity/OpeningHours' }
stack: { uninitializedThis, 'com/totaalsoftware/incidentmanager/entity/OpeningHours' }
Bytecode:
0000000: 2a2b b600 542a b700 0eb1
at com.totaalsoftware.incidentmanager.entity.OpeningHours.sortedDays(OpeningHours.java:125)
at com.totaalsoftware.incidentmanager.entity.OpeningHours.getSummary(OpeningHours.java:100)
... 99 more
This exception looks a bit daunting. I am not sure what is going on here, but it looks nothing like a normal exception, rather it looks like a dump from a JVM crash.
It turns out that Hibernate is modifying the inline Comparator
class. The solution is simple: lift that Comparator
class out of the @Entity
class, and all is fixed.