Текстовый блок 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
Другие вопросы по тегам