Question

I have a bit of Java I want to edit (it is a Minecraft mod) I decompiled the .class files (with jd-gui), edited what I wanted to, then attempted to recompile (with javac).

I got hundreds of errors. I only edited a few lines though, so I tried compiling the .java's that were unedited, exactly as they were from the decompiler. Same thing, hundreds of errors.

Know very little about Java, so I am certain I am making some mistake. Why can't it compile code that has not been edited from a valid working .class file?

Here is a sample of what I get:

ReiMinimap.java:451: illegal start of expression
              switch (???)
              ^
ReiMinimap.java:451: ';' expected
              switch (???)
                    ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                      ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                        ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                         ^
ReiMinimap.java:452: illegal start of expression
              {
              ^
ReiMinimap.java:452: : expected
              {
               ^
ReiMinimap.java:453: ';' expected
              case 49:
                     ^
ReiMinimap.java:453: ')' expected
              case 49:
                      ^
ReiMinimap.java:454: illegal start of expression
                this.allowCavemap = true;
                    ^
ReiMinimap.java:454: ';' expected
                this.allowCavemap = true;
                     ^
ReiMinimap.java:454: illegal start of expression
                this.allowCavemap = true;
                                  ^
ReiMinimap.java:454: ';' expected
                this.allowCavemap = true;
                                   ^
ReiMinimap.java:456: orphaned case
              case 50:
              ^
ReiMinimap.java:308: 'try' without 'catch' or 'finally'
    try { if (paramMinecraft == null);
    ^
ReiMinimap.java:499: illegal start of type
      else
      ^
ReiMinimap.java:499: ';' expected
      else
          ^
ReiMinimap.java:501: illegal start of type
        this.chatWelcomed = true;
        ^
ReiMinimap.java:501: <identifier> expected
        this.chatWelcomed = true;
            ^
ReiMinimap.java:501: ';' expected
        this.chatWelcomed = true;
             ^
ReiMinimap.java:501: illegal start of type
        this.chatWelcomed = true;
                          ^
ReiMinimap.java:501: <identifier> expected
        this.chatWelcomed = true;
                           ^

And some of the code:

if ((!this.chatWelcomed) && (System.currentTimeMillis() < this.chatTime + 10000L))
      {
        Object localObject1;
        for (localObject2 = this.chatLineList.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject1 = (ahe)((Iterator)localObject2).next();

          if ((localObject1 == null) || (this.chatLineLast == localObject1)) break;
          Matcher localMatcher1 = Pattern.compile("§0§0((?:§[1-9a-d])+)§e§f").matcher(((ahe)localObject1).a);
          while (localMatcher1.find())
          {
            this.chatWelcomed = true;
            for (??? : localMatcher1.group(1).toCharArray())
            {
              switch (???)
              {
              case 49:
                this.allowCavemap = true;
                break;
              case 50:
                this.allowEntityPlayer = true;
                break;
              case 51:
                this.allowEntityAnimal = true;
                break;
              case 52:
                this.allowEntityMob = true;
                break;
              case 53:
                this.allowEntitySlime = true;
                break;
              case 54:
                this.allowEntitySquid = true;
                break;
              case 55:
                this.allowEntityLiving = true;
              }
            }
          }
Was it helpful?

Solution

It sounds like the original Java compilation was obfuscated. There are many tricks that obfuscators use to make it difficult to reverse engineer code. For instance, it is legal to have method and field names in .class files that are reserved words in Java source (for, if, etc.) If the obfuscator uses such tricks, then when you decompile the .class file, the Java source is illegal because you can't use those reserved words as method or field names.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top