VerifyError пустой стек в байт-коде, пока что-то находится в стеке - PullRequest
1 голос
/ 07 мая 2020

У меня есть следующий код, который выдает ошибку при запуске с двумя операторами печати, но когда я делаю только один, он работает нормально. Если я прав, ld c просто помещает строку в стек, поэтому при вызове второй строки печати у нее все еще должно быть что-то в стеке.

.class public test
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
.limit stack 5
.limit locals 3

getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "this would work if only this line was printed"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
ldc "but when trying to print this it says it's not on stack?"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method

Ошибка:

java.lang.VerifyError: (class: test, method: main signature: ([Ljava/lang/String;)V) Unable to pop operand off an empty stack
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"
...