Текстовый блок Java 14 в начале \r\n вставлен при использовании в Eclipse 4.15.0
Я сейчас учусь работать с текстовыми блоками java 14 (превью). При использовании следующего текстового блока в тесте Junit я сталкиваюсь со следующей неожиданной функцией (пример упрощенного кода, в реальном тесте я использую фрагмент HTML):
assertEquals("""
test""", "test");
Выполнение этого теста приводит к ошибке, поскольку "\r\ntest"
не совпадает "test"
:
org.junit.ComparisonFailure: expected:<[
]test> but was:<[]test>
Когда я обращаюсь к документации (https://docs.oracle.com/javase/specs/jls/se14/preview/specs/text-blocks-jls.html), в ней буквально говорится:
Содержимое текстового блока - это последовательность символов, которая начинается сразу после ограничителя строки открывающего ограничителя и заканчивается непосредственно перед первой двойной кавычкой закрывающего ограничителя.
Я что-то пропустил?
Обновление после нескольких вопросов и предложений:
я создаю небольшой тестовый класс:
public class Tester {
public static void main(String[] args) {
System.out.println(">>" + """
test""");
}
}
который при выполнении выводит следующее:
>>
test
Байт-код этого класса
Compiled from "Tester.java"
public class nl.paul.testapp.testutil.Tester {
public nl.paul.testapp.testutil.Tester();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String >>test
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
3 ответа
Eclipse 2020-03 (4.15) не поддерживает Java 14. Вы установили поддержку Java 14 для Eclipse 2020-03 (4.15) из Eclipse Marketplace, который является предварительной / бета-версией предстоящей поддержки Java 14 для Eclipse 2020-06. (4.16), которая будет выпущена 17 июня 2020 г.
В текущем выпуске-кандидате Eclipse 2020-06(4.16) RC1 он работает должным образом. Таким образом, это уже исправленная ошибка компилятора Eclipse для Java (ecj) в сборке, а не в выпуске ( согласно процессу разработки Eclipse).
Запись в Marketplace по-прежнему относится к устаревшей предварительной версии и, вероятно, будет обновлена вскоре после выпуска (как это произошло с другими новыми поддерживаемыми версиями Java ранее).
Пожалуйста, обратите внимание, текстовые блоки предварительного просмотра функции из Java 13 (первая предпросмотра) и Java 14 (второй предварительный просмотр, улучшение) и, следовательно, еще не является частью спецификации языка Java. Он не предназначен для использования в производстве.
Наконец-то проблема ясна. Это связано с Eclipse. Когда я компилирую и запускаю код из командной строки (та же версия java, что и Eclipse), все работает, как ожидалось. Когда я компилирую и запускаю тот же код из Eclipse, текстовый блок добавляется к \r\n.
Отредактирую формулировку вопроса.
Похоже, ты что-то делаешь не так. JLS говорит:
Содержимое текстового блока - это последовательность символов, которая начинается сразу после ограничителя строки открывающего ограничителя и заканчивается непосредственно перед первой двойной кавычкой закрывающего ограничителя.
JEP 378 (текстовые блоки) подтверждает это:
Открывающий разделитель - это последовательность из трех символов двойных кавычек ("""), за которыми следуют ноль или более пробелов, за которыми следует признак конца строки.Содержимое начинается с первого символа после ограничителя строки открывающего ограничителя.
...
""" line 1 line 2 line 3 """ is equivalent to the string literal: "line 1\nline 2\nline 3\n"
Я также проверил это на своей машине:
System.out.println("""
test""".equals("test")); // Prints true