问题
Getting this error on an IntelliJ project when I compile java files. There is no specific source file listed, but it fails with this error.
Removing the following compiler flags fixes the error:
-source 1.5 -target 1.5
However, these need to be in there as we are targeting Java 5. Is there some specific code (maybe a try/catch
block) that is causing this error?
2013-10-15 16:21:50,556 [26947209] INFO - ompiler.BackendCompilerWrapper - JSR/RET are not supported with computeFrames option
java.lang.RuntimeException: JSR/RET are not supported with computeFrames option
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.MethodWriter.visitJumpInsn(Unknown Source)
at org.objectweb.asm.MethodAdapter.visitJumpInsn(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at com.intellij.compiler.impl.javaCompiler.BackendCompilerWrapper$ClassParsingThread.a(BackendCompilerWrapper.java:893)
at com.intellij.compiler.impl.javaCompiler.BackendCompilerWrapper$ClassParsingThread.run(BackendCompilerWrapper.java:846)
at com.intellij.openapi.application.impl.ApplicationImpl$7.run(ApplicationImpl.java:386)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)
at com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:130)
回答1:
JSR/RET instructions appear in the byte code when try/finally blocks appear in the source. Javac 1.6+ doesn't seem to emit them even with -target 1.5, but Eclipse java compiler does.
Example
public class JSRDemo {
public static void main(String[] args) {
try {
bodyOfTry();
}
finally {
bodyOfFinally();
}
}
...
Byte codes
// access flags 0x9
public static main([Ljava/lang/String;)V
TRYCATCHBLOCK L0 L1 L1 null
TRYCATCHBLOCK L2 L3 L1 null
L0
LINENUMBER 4 L0
INVOKESTATIC JSRDemo.bodyOfTry ()V
L4
LINENUMBER 5 L4
GOTO L2
L1
LINENUMBER 6 L1
ASTORE 2
JSR L5 // JSR jumps to the finally block
L6
LINENUMBER 8 L6
ALOAD 2
ATHROW
L5
LINENUMBER 6 L5
ASTORE 1
L7
LINENUMBER 7 L7
INVOKESTATIC JSRDemo.bodyOfFinally ()V
L8
LINENUMBER 8 L8
RET 1 // RET returns from the finally block
L2
JSR L5 // Jump to the same finally block from another execution path
L3
LINENUMBER 9 L3
RETURN
L9
LOCALVARIABLE args [Ljava/lang/String; L0 L9 0
MAXSTACK = 1
MAXLOCALS = 3
来源:https://stackoverflow.com/questions/19381417/compile-error-jsr-ret-are-not-supported-with-computeframes-option