.version 49 0 .source Example.java .class super public Example .super java/lang/Object .method public <init> : ()V .limit stack 1 .limit locals 1 aload_0 invokespecial java/lang/Object <init> ()V return .end method .method static public main : ([Ljava/lang/String;)V .limit stack 2 .limit locals 1 goto first second: pop getstatic java/lang/System out Ljava/io/PrintStream; ldc 'Hello world' invokevirtual java/io/PrintStream println (Ljava/lang/String;)V goto third first: jsr_w second third: return .end method
jsr_w is the wide version of jsr, an instruction which places a return location on the stack and jumps. The intended use of this instruction is, in combination with ret, to allow the use of subroutines. In this instance, I simply discard the return value, making its functionality practically identical to goto_w, although in this instance, decompilers may be looking for a ret which doesn't exist.
CFR 0.103 /* * Decompiled with CFR 0_103. */ public class Example { public static void main(String[] arrstring) { Object v0 = null; } }

This was fixed in 0.105. Apparently I'm also credited in the changelog. <3

Procyon 0.5.30 // // Decompiled by Procyon v0.5.30 // public class Example { public static void main(final String[] p0) { // // This method could not be decompiled. // // Could not show original bytecode, likely due to the same error. // // The error that occurred was: // // com.strobel.assembler.metadata.MethodBodyParseException: An error occurred while parsing the bytecode of method 'Example.main:([Ljava/lang/String;)V'. // at com.strobel.assembler.metadata.MethodReader.readBody(MethodReader.java:65) // at com.strobel.assembler.metadata.MethodDefinition.tryLoadBody(MethodDefinition.java:722) // at com.strobel.assembler.metadata.MethodDefinition.getBody(MethodDefinition.java:83) // at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:202) // at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:99) // at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:757) // at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:655) // at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:532) // at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:499) // at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:141) // at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:130) // at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:105) // at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71) // at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59) // at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:317) // at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:141) // Caused by: java.lang.NullPointerException // at com.strobel.assembler.metadata.MethodReader.readBodyCore(MethodReader.java:170) // at com.strobel.assembler.metadata.MethodReader.readBody(MethodReader.java:62) // ... 15 more // throw new IllegalStateException("An error occurred while decompiling this method."); } }

Mike has fixed this. The next release should not have this issue

JD-GUI 1.4.0 public class Example { /* Error */ public static void main(String[] arg0) { // Byte code: // 0: goto +15 -> 15 // 3: pop // 4: getstatic 17 java/lang/System:out Ljava/io/PrintStream; // 7: ldc 1 // 9: invokevirtual 23 java/io/PrintStream:println (Ljava/lang/String;)V // 12: goto +8 -> 20 // 15: jsr_w -1 -1 -1 -12 // 20: return } }

This may be fixed in a future release.

Fernflower @810818e public class Example { public static void main(String[] var0) { System.out.println("Hello world"); } }