FULL PRODUCT VERSION :
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) Client VM (build 25.11-b03, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
Using an outer class field reference in the call to the super constructor of an inner class that extends another inner class results in no compiler errors but generates a VerifyError when run.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run the minimal example entered at 'Source code for an executable test case' below.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Successful execution without error.
ACTUAL -
VerifyError
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
bug/Problem$Sub.<init>(Lbug/Problem;)V @8: invokedynamic
Reason:
Type uninitializedThis (current frame, stack[2]) is not assignable to 'bug/Problem$Sub'
Current Frame:
bci: @8
flags: { flagThisUninit }
locals: { uninitializedThis, 'bug/Problem' }
stack: { uninitializedThis, 'bug/Problem', uninitializedThis }
Bytecode:
0000000: 2a2b b500 022a 2b2a ba00 0300 00b7 0004
0000010: b1
at bug.Problem.main(Problem.java:8)
Java Result: 1
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class Problem {
private final String text = "";
public static void main(String[] args) {
new Problem().new Sub();
}
private class Super<T> {
public Super(java.util.function.Consumer<T> consumer) {
}
}
private class Sub extends Super<String> {
public Sub() {
super(s -> System.out.println(text));
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Use an anonymous inner class instead of a lambda for the parameter. e.g.
...
public Sub() {
//super(s -> System.out.println(text));
super(new java.util.function.Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(text);
}
});
}
...
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) Client VM (build 25.11-b03, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
Using an outer class field reference in the call to the super constructor of an inner class that extends another inner class results in no compiler errors but generates a VerifyError when run.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run the minimal example entered at 'Source code for an executable test case' below.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Successful execution without error.
ACTUAL -
VerifyError
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
bug/Problem$Sub.<init>(Lbug/Problem;)V @8: invokedynamic
Reason:
Type uninitializedThis (current frame, stack[2]) is not assignable to 'bug/Problem$Sub'
Current Frame:
bci: @8
flags: { flagThisUninit }
locals: { uninitializedThis, 'bug/Problem' }
stack: { uninitializedThis, 'bug/Problem', uninitializedThis }
Bytecode:
0000000: 2a2b b500 022a 2b2a ba00 0300 00b7 0004
0000010: b1
at bug.Problem.main(Problem.java:8)
Java Result: 1
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class Problem {
private final String text = "";
public static void main(String[] args) {
new Problem().new Sub();
}
private class Super<T> {
public Super(java.util.function.Consumer<T> consumer) {
}
}
private class Sub extends Super<String> {
public Sub() {
super(s -> System.out.println(text));
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Use an anonymous inner class instead of a lambda for the parameter. e.g.
...
public Sub() {
//super(s -> System.out.println(text));
super(new java.util.function.Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(text);
}
});
}
...
- duplicates
-
JDK-8054275 Javac on bad class file get java.lang.AssertionError at com.sun.tools.javac.jvm.ClassReader.readClassOrType(ClassReader.java:572)
-
- Closed
-