棘手的try-catch java代码

For*_*med 12 java

public class Strange1 {
  public static void main(String[] args) {
    try {
      Missing m = new Missing();
    } catch (java.lang.NoClassDefFoundError ex) {
      System.out.println("Got it!");
    }
  }
}

public class Strange2 {
  public static void main(String[] args) {
    Missing m;
    try {
      m = new Missing();
    } catch (java.lang.NoClassDefFoundError ex) {
      System.out.println("Got it!");
    }
  }
}

class Missing {
  Missing() { }
}
Run Code Online (Sandbox Code Playgroud)

如果您在删除后运行Strange1和Strange2 Missing.class,Strange1将抛出,NoClassDefFoundError;但Strange2将打印得到它!

有谁能解释一下?谢谢.

更新:

java字节码Strange1:

     0  new info.liuxuan.test.Missing [16]
     3  dup
     4  invokespecial info.liuxuan.test.Missing() [18]
     7  astore_1 [m]
     8  goto 20
    11  astore_1 [ex]
    12  getstatic java.lang.System.out : java.io.PrintStream [19]
    15  ldc <String "Got it!"> [25]
    17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [27]
    20  return
      Exception Table:
        [pc: 0, pc: 8] -> 11 when : java.lang.NoClassDefFoundError
      Line numbers:
        [pc: 0, line: 14]
        [pc: 11, line: 15]
        [pc: 12, line: 16]
        [pc: 20, line: 18]
      Local variable table:
        [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[]
        [pc: 8, pc: 11] local: m index: 1 type: info.liuxuan.test.Missing
        [pc: 12, pc: 20] local: ex index: 1 type: java.lang.NoClassDefFoundError
Run Code Online (Sandbox Code Playgroud)

java字节码Strange2:

     0  new info.liuxuan.test.Missing [16]
     3  dup
     4  invokespecial info.liuxuan.test.Missing() [18]
     7  astore_1 [m]
     8  goto 20
    11  astore_2 [ex]
    12  getstatic java.lang.System.out : java.io.PrintStream [19]
    15  ldc <String "Got it!"> [25]
    17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [27]
    20  return
      Exception Table:
        [pc: 0, pc: 8] -> 11 when : java.lang.NoClassDefFoundError
      Line numbers:
        [pc: 0, line: 15]
        [pc: 11, line: 16]
        [pc: 12, line: 17]
        [pc: 20, line: 19]
      Local variable table:
        [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[]
        [pc: 8, pc: 11] local: m index: 1 type: info.liuxuan.test.Missing
        [pc: 12, pc: 20] local: ex index: 2 type: java.lang.NoClassDefFoundError
Run Code Online (Sandbox Code Playgroud)

只有一个地方是不同的:

11  astore_1 [ex]
Run Code Online (Sandbox Code Playgroud)

11  astore_2 [ex]
Run Code Online (Sandbox Code Playgroud)

再次更新:

每个人都可以在日食中尝试.

nge*_*esh 2

在说任何事情之前,我怀疑这段代码甚至无法编译。因为当编译器找不到一个类时(自从它被删除)。尝试使用命令编译它时可能会出现错误javac。如果是这样的话,那就很正常了,一点也不奇怪。

让我添加另一点..检查您的导入,以包含Missing class。如果存在则将其删除。并告诉我们发生了什么事。

  • 我希望你说的是真的,但看起来他经历了相反的行为(评论中的所有内容都不可忽视)——变量声明确实被抓住了。 (2认同)