Ich erstelle einen Lieferanten für einen inneren Klassenkonstruktor mit dem Lambda ctx -> new SpectatorSwitcher(ctx)
. IntelliJ schlug vor, dass ich stattdessen SpectatorSwitcher::new
ändere. SpectatorSwitcher ist eine nicht-statische innere Klasse der Klasse in Ich arbeite Der vorgeschlagene Code fein kompiliert (mit Maven), aber ich bekomme die folgende VerifyError auf Ausführung.Konstruktorreferenz für innere Klasse schlägt mit VerifyError zur Laufzeit fehl
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
Test.lambda$runTest$8(LTest$Worker;)V @2: invokedynamic
Reason:
Type 'Test$Worker' (current frame, stack[1]) is not assignable to 'Test'
Current Frame:
bci: @2
flags: { }
locals: { 'Test$Worker' }
stack: { 'Test$Worker', 'Test$Worker' }
Bytecode:
0000000: 2a2a ba00 0b00 00b6 000c b1
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getMethod0(Class.java:2937)
at java.lang.Class.getMethod(Class.java:1771)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Warum versagt javac/Maven nicht während Kompilieren, aber immer noch produzieren ungültigen Byte-Code?
Edit: Das Problem weitaus komplexer als die einfachen Aufruf zu sein scheint, dies ist der Code benötigt es zu reproduzieren:
import java.util.function.Function;
/**
* @author Yawkat
*/
public class Test {
public static void main(String[] args) { new Test().runTest(); }
private void runTest() {
Worker worker = new Worker();
run(() -> worker.print(field -> new SomeClass(field)));
run(() -> worker.print(SomeClass::new));
}
private void run(Runnable runnable) {
runnable.run();
}
private class SomeClass {
final Object field;
SomeClass(Object field) {
this.field = field;
}
}
private static class Worker {
void print(Function<Object, Object> i) {
System.out.println(i.apply(null));
}
}
}
Können Sie uns ein kleines reproduzierbares Code-Snippet geben? –
@SotiriosDelimanolis Ich musste noch mehr recherchieren, weil der benötigte Code viel komplexer ist, als ich dachte. Ich habe es hinzugefügt. – yawkat
Sieht aus wie ein JVM-Fehler. Bitte überlege, einen Fehlerbericht einzureichen. –