【发布时间】:2016-04-27 17:12:19
【问题描述】:
如果我编译以下源代码:
1. public class Example {
2. public boolean foo(boolean a, boolean b, char ch) {
3. if (a && Character.isLetter(ch)
4. || b && Character.isDigit(ch)
5. || !a && !b) {
6. return true;
7. }
8. return false;
9. }
10. }
使用 Java-7(OpenJDK 或 Oracle)我得到以下 LineNumberTable:
line 3: 0
line 6: 30
line 8: 32
但是,使用 Java 8(OpenJDK 或 Oracle)编译相同的源代码,我得到了另一个 LineNumberTable:
line 3: 0
line 4: 16
line 6: 30
line 8: 32
为什么 Java 7 返回的 LineNumberTable 不包括第 4 行和第 5 行?
为什么 Java 8 返回的 LineNumberTable 不包含第 5 行?
【问题讨论】:
-
可能是 java-8 只是为调试添加更多消息? LineNumberTable 用于调试器将字节码与源代码连接起来。
-
是的,用于调试器和许多其他用途,例如依赖字节码的 JaCoCo/Eclemma 等覆盖工具。实际上,Eclipse 并不使用 Javac 编译 Java 文件(而是使用内部编译器),而上述代码的字节码(即 LineNumberTable)包含所有数字(3,4,5,6,8)。
-
您已经清楚地证明了 javac 省略了这些行号。不过,您为什么希望这些台词出现?