2013-10-15 2 views
6

Получение этой ошибки в проекте IntelliJ при компиляции java-файлов. В списке нет конкретного исходного файла, но он не работает с этой ошибкой.Ошибка компиляции: JSR/RET не поддерживаются с помощью параметра computeFrames

Удаления следующих флагов компилятора исправляет ошибку:

-source 1.5 -target 1.5 

Однако они должны быть там, как мы нацелены на Java 5. Есть некоторый конкретный код (возможно try/catch блока), что является причина этого ошибка?

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) 
+0

ли кто-то есть решение для этой ошибки (JSR/RET не поддерживаются с опцией computeFrames)? –

+0

«JSRInlinerAdapter» работал для меня: http://mail-archive.ow2.org/asm/2008-11/msg00008.html – mschonaker

ответ

1

Инструкции JSR/RET отображаются в байтовом коде, когда в источнике появляются блоки try/finally. Javac 1.6+, похоже, не выделяет их даже с -target 1.5, но компилятор Eclipse java.

Пример

public class JSRDemo { 
    public static void main(String[] args) { 
     try { 
      bodyOfTry(); 
     } 
     finally { 
      bodyOfFinally(); 
     } 
    } 

... 

байт-кодов

// 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 
+1

, так как это исправлено? – stealthjong

+0

@stealthjong Я думаю, переключение на 'javac' может помочь –

 Смежные вопросы

  • Нет связанных вопросов^_^