当前位置: 首页 > 知识库问答 >
问题:

Java14个文本块,在Eclipse 4.15.0中使用时插入\r\n

戚飞雨
2023-03-14

我正在学习如何处理Java14(预览)文本块。在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个答案

令狐弘益
2023-03-14

看来你做错了什么。联合联络小组说:

文本块的内容是紧接着开头分隔符的行终止符之后开始,紧接着结尾分隔符的第一个双引号之前结束的字符序列。

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
刁跃
2023-03-14

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

在当前的候选发行版Eclipse2020-06(4.16)RC1中,它按预期工作。因此,它是一个已修复的Eclipse编译器for Java(ecj)bug,它只存在于一个构建中,而不存在于一个发行版中(根据Eclipse开发过程)。

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

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

严昊昊
2023-03-14

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

 类似资料:
  • 主要内容:Java14 文本块的示例Java 13 引入了文本块来处理多行字符串,如 JSON/XML/HTML 等,这是一项预览功能。在 Java 14 中,我们对文本块进行了第二次预览。现在文本块有以下增强功能 : \ : 表示行的结束,以防要开始新行。 \s : 表示单个空格。 Java14 文本块的示例 ApiTester.java 编译并运行程序 输出结果为  

  • 问题内容: 我正在尝试使用该软件包在R中导入python模块。该模块可以在这里找到。我克隆了存储库并运行成功。如果打开python shell,则可以导入。但是,当我尝试将其导入RStudio时,出现以下错误: 我在macOS Sierra版本10.12.6上并通过Anaconda安装了python 3.6。我也尝试过给出python的路径为: 当我从终端运行python时,我得到: 不确定pyt

  • 我想用字符串替换元素和“randmsg”。下面是我现在掌握的: 有什么想法吗?我是一个JavaScript傻瓜,我做错了什么?

  • 问题内容: 我的页面上有很多文本框。当有人单击链接时,我希望在光标所在的位置插入一两个单词,或将其附加到具有焦点的文本框中。 例如,如果光标/焦点在文本框上说“ apple”,而他单击一个链接上说“ [email]”,那么我希望文本框说“ apple bob@example.com”。 我怎样才能做到这一点?如果焦点集中在radio / dropdown / non textbox元素上,该怎么办

  • 我试图在JavaFX应用程序中播放声音,但由于以下错误而失败: 我正在使用Java14和JavaFX14。我尝试使用本地文件或将URI传递给媒体/音频唇,但总是以这个错误结束。 我总是得到相同的错误,我尝试将添加到VM参数中,但没有改变任何东西。

  • 问题内容: 我的样本代码 执行前要演示 执行后的demo.txt 我也尝试使用setLength来更改文件的长度,然后再添加新文本。但是仍然从输出文件中修剪了一些文本。任何帮助将不胜感激 谢谢马修 问题答案: 随机访问文件的行为就像存储在文件系统中的大字节数组一样。 实际上,在写操作的情况下它并不关心移动数组元素(仅 指针 是先进的)。这样的操作将覆盖现有值: 输出操作从文件指针开始写入字节,然后