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
}
4

3 回答 3

2

最后,问题很清楚了。它与 Eclipse 相关。当我从命令提示符(与 Eclipse 使用的 java 版本相同)编译和运行代码时,一切都按预期工作。当我在 Eclipse 中编译和运行相同的代码时,文本块前面带有 \r\n。
我将编辑问题措辞。

于 2020-06-08T15:46:53.917 回答
1

Eclipse 2020-03 (4.15) 不支持 Java 14。您已从 Eclipse Marketplace 安装Java 14 Support for Eclipse 2020-03 (4.15),这是即将推出的 Eclipse 2020-06 Java 14 支持的预览/测试版(4.16) 将于 2020 年 6 月 17 日发布。

在当前的候选版本Eclipse 2020-06 (4.16) RC1中,它按预期工作。因此,它是构建中已经修复的 Eclipse Compiler for Java (ecj) 错误,而不是发布中的错误根据 Eclipse Development Process)。

Marketplace 条目仍然指的是一个过时的预览版本,并且可能会在发布后不久更新(就像之前其他支持的新 Java 版本一样)。

请注意,文本块是 Java 13(第一次预览)和 Java 14(第二次预览;改进)的预览功能因此还不Java语言规范的一部分。它不打算在生产中使用。

于 2020-06-08T16:20:27.327 回答
0

看起来你做错了什么。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
于 2020-06-08T14:16:53.207 回答