2013-10-15 14 views
6

Ottenere questo errore in un progetto IntelliJ quando compilo i file java. Non c'è un file sorgente specifico elencato, ma fallisce con questo errore.Errore di compilazione: JSR/RET non sono supportati con l'opzione computeFrames

Rimozione delle seguenti opzioni del compilatore risolve l'errore:

-source 1.5 -target 1.5 

Tuttavia, questi devono essere lì come ci stanno prendendo di mira Java 5. C'è qualche codice specifico (forse un blocco try/catch) che causa questo errore?

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

Se qualcuno ha una soluzione per questo errore (JSR/RET non sono supportati opzione computeFrames con)? –

+0

Il 'JSRInlinerAdapter' ha funzionato per me: http://mail-archive.ow2.org/asm/2008-11/msg00008.html – mschonaker

risposta

1

Le istruzioni JSR/RET vengono visualizzate nel codice byte quando i blocchi try/finally vengono visualizzati nella sorgente. Javac 1.6+ non sembra emetterli nemmeno con -target 1.5, ma fa il compilatore java Eclipse.

Esempio

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

... 

codici Byte

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

quindi come è stato risolto? – stealthjong

+0

@stealthjong Suppongo che il passaggio a 'javac' potrebbe aiutare –

Problemi correlati