Давным-давно я случайно исправил ошибку в Java3D, добавив
комментарий. Это было воспроизводимо на 100%; если я удалил комментарий, это
разбился. Пока комментарий был там, он работал нормально. Я предполагаю это
была какая-то странная временная проблема, но я так и не понял, что именно
происходило.
Это возможно?
Если он исправлял segfault в Java3D, я думаю, он писал код на Java или C / C ++. Я думал, что на любом из этих языков комментарии просто стираются перед компиляцией …
Я думал, что на любом из этих языков комментарии просто стираются
до компиляции …
Казалось бы, но, к сожалению, это безвредный-Ищу Hello World Программа даже не скомпилируется.
Зачем? Из-за комментарий. Виновником является путь источник. В частности, \users, Обратная косая черта \ сопровождается буквой u, обозначает начало экранирования Юникода. Трейлинг sers делает это неудачным выходом из Юникода. (Было бы хорошо, если \u за ним следовали 4 шестнадцатеричные цифры — да, это нужно даже в комментарии.)
Таким образом, код даже не скомпилируется из-за комментария.
public class HelloWorld {
/**
* Source: C:\users\devnull\HelloWorld.java
*/
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
1
Другие решения
Как вы заявляете, в Java комментарии не включены в скомпилированный байт-код. Для примера возьмем следующий класс:
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, с помощью javap -c testмы видим, что байт-код для обоих методов идентичен — за исключением строки, которая выводится на консоль:
public class test {
public test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()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
}
2
Вот два объяснения этому.
Во-первых, репортер был неправ. Они не делали редактирование, которое, как они полагали, они делали или компилировали или выполняли неправильно, или ошибка была ошибочной и случайно совпала с их изменениями, и так далее.
Во-вторых, редактирование удалило то, что выглядело как комментарий, но на самом деле оно взаимодействовало с другим синтаксисом. Например, рассмотрим:
/* Start comment.
…
/* Not a new comment. */
… Some code here …
/* Sometimes a comment. */
Когда присутствует строка «Не новый комментарий», «Некоторый код здесь» является исходным кодом, который не является частью комментария. Если строка «Не новый комментарий» отсутствует, «Некоторый код здесь» является частью комментария.
1
Не думай так. Чтобы запустить Java-программу, она должна быть скомпилирована в байт-код, чтобы комментарии были удалены во время компиляции и не могли повлиять на выполнение программы.
чтение Какой самый лучший комментарий Я приветствую этот комментарий, проголосовавший 201 раз:
Это возможно?
Если он исправлял segfault в Java3D, я думаю, он писал код на Java или C / C ++. Я думал, что на любом из этих языков комментарии просто стираются перед компиляцией …
Решение
Казалось бы, но, к сожалению, это безвредный-Ищу
Hello World
Программа даже не скомпилируется.Зачем? Из-за комментарий. Виновником является путь источник. В частности,
\users
, Обратная косая черта\
сопровождается буквойu
, обозначает начало экранирования Юникода. Трейлингsers
делает это неудачным выходом из Юникода. (Было бы хорошо, если\u
за ним следовали 4 шестнадцатеричные цифры — да, это нужно даже в комментарии.)Таким образом, код даже не скомпилируется из-за комментария.
Другие решения
Как вы заявляете, в Java комментарии не включены в скомпилированный байт-код. Для примера возьмем следующий класс:
Если мы проанализируем байт-код с
javap
, с помощьюjavap -c test
мы видим, что байт-код для обоих методов идентичен — за исключением строки, которая выводится на консоль:Вот два объяснения этому.
Во-первых, репортер был неправ. Они не делали редактирование, которое, как они полагали, они делали или компилировали или выполняли неправильно, или ошибка была ошибочной и случайно совпала с их изменениями, и так далее.
Во-вторых, редактирование удалило то, что выглядело как комментарий, но на самом деле оно взаимодействовало с другим синтаксисом. Например, рассмотрим:
Когда присутствует строка «Не новый комментарий», «Некоторый код здесь» является исходным кодом, который не является частью комментария. Если строка «Не новый комментарий» отсутствует, «Некоторый код здесь» является частью комментария.
Не думай так. Чтобы запустить Java-программу, она должна быть скомпилирована в байт-код, чтобы комментарии были удалены во время компиляции и не могли повлиять на выполнение программы.