在运行期间,评论可以有什么不同吗?

阅读这篇评论的最佳评论是什么 ,赞成了201次:

很久以前,我偶然通过添加注释修复了Java3D中的段错误。 它是100%可重复的; 如果我删除了评论,它就会崩溃。 只要评论在那里,它运作良好。 我认为这是一个奇怪的计时问题,但我从来没有弄清楚究竟发生了什么。

这可能吗?

如果他正在修复Java3D中的段错误,我猜他正在用Java或C / C ++编写代码。 我认为在任何一种语言中,评论都会在编译之前被删除……

我认为在任何一种语言中,评论都会在编译之前被删除……

它可能看起来如此,但不幸的是,这个无害的 Hello World程序甚至无法编译。

为什么? 因为评论 。 罪魁祸首是源头的道路。 具体来说, \users 。 反斜杠\后跟字母u ,表示Unicode转义的开始。 尾随的sers使它成为一个格式错误的Unicode转义。 (如果\u后跟4个hex数字,那就没问题了 – 是的,即使在评论中也需要它。)

因此, 由于评论 ,代码甚至不会编译。

 public class HelloWorld { /** * Source: C:\users\devnull\HelloWorld.java */ public static void main(String[] args) { System.out.println("Hello World!"); } } 

正如您所述,在Java中,注释不包含在已编译的字节码中。 对于eaxmple,请参加以下课程:

 public class test { public void methodWithoutComment() { System.out.println("This method does not have a comment"); } public void methodWithComment() { // Method with comment System.out.println("This method has a comment"); } } 

如果我们使用javap -c testjavap内省代码进行内省,我们可以看到两种方法的字节码是相同的 – 除了输出到控制台的字符串:

 public class test { public test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public void methodWithoutComment(); Code: 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String This method does not have a comment 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return public void methodWithComment(); Code: 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #5 // String This method has a comment 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return } 

以下是对此的两种解释。

一,记者错了。 他们没有进行他们认为正在制作或正在编译或执行不正确的编辑,或者错误是不稳定的,并且与他们的编辑偶然相符, 等等

二,编辑删除了看起来像评论的东西,但它实际上与其他语法交互。 例如,考虑:

 /* Start comment. … /* Not a new comment. */ … Some code here … /* Sometimes a comment. */ 

当存在“非新注释”行时,“此处的某些代码”是不是注释的源代码。 当“不是新评论”行不存在时,“此处的某些代码”是评论的一部分。

不要这么认为。 为了运行Java程序,应将其编译为字节码,以便在编译期间删除注释,并且不会影响程序的执行。