java 15+ 支持三引号文本块("""..."""),需确保 jdk≥15 且编译/运行环境配置正确;其自动去除最小前导缩进,末尾换行默认保留,编译期转为普通字符串字面量,无运行时开销。

Java 15+ 怎么写多行字符串才不报错
直接用三引号 """ 包裹,但必须确保 JDK 版本 ≥ 15,且编译和运行时都启用文本块支持(默认已启用)。低于 15 的版本会直接编译失败,报错信息是 error: illegal start of expression 或 error: unclosed string literal。
常见错误现象:粘贴了 Python 风格的三引号字符串到 Java 8/11 项目里,IDE 红标一片,连 javac 都过不了。
- 确认版本:
java -version和javac -version输出至少为15.0.x - 如果用 Maven,检查
pom.xml中maven.compiler.source和maven.compiler.target是否设为15或更高 - IntelliJ 用户需在
File → Project Structure → Project → Project SDK / Language level设为15 (Preview) - Text Blocks或更高
Text Blocks 的缩进怎么算才不混进多余空格
Java 文本块自动去除前导空白的逻辑很具体:它取所有非空行的最小缩进量,再把每行开头的这部分空白全砍掉。不是“去掉左边所有空格”,也不是“按第一行缩进对齐”。
使用场景:拼 SQL、JSON 模板、HTML 片段时,希望代码缩进可读,又不想运行时多出一堆空格。
立即学习“Java免费学习笔记(深入)”;
示例对比:
String sql = """
SELECT id, name
FROM user
WHERE status = ?
""";
// 实际值是 "SELECT id, name\nFROM user\nWHERE status = ?\n"(末尾换行保留,首行缩进全去掉)- 空行也参与缩进计算——如果某空行缩进比其他行少,会导致整体缩进量变小,部分行可能被意外截断
- 末尾换行符默认保留;想删掉就用
.stripTrailing(),但注意这会同时干掉内容末尾的空格 - 如果首行是空行或只有空格,整个缩进基准会失效,导致各行原样保留(包括你写的缩进)
Text Blocks 和普通字符串拼接性能差多少
编译期就处理完了,运行时跟写死的 "a\nb\nc" 没区别,没有额外对象创建或解析开销。别担心“用了文本块就变慢”——它不是运行时 API,而是语法糖。
但要注意兼容性影响:如果你的库要支持 Java 11,就不能用文本块,否则下游用户升级 JDK 前就会编译失败。
- 反编译 class 文件可见,文本块最终生成的是标准
String字面量 +\n转义序列 - 字符串常量池行为一致,相同内容的文本块和普通字符串字面量会指向同一个
String实例 - 不要为了“看起来清爽”在循环里反复写文本块——虽然没运行时成本,但可读性差,且容易误加空行破坏缩进逻辑
为什么 JSON/XML 里换行后字段名总对不齐
因为文本块会忠实保留你写的换行和内部空格,但不会自动格式化内容。比如写 JSON 时手动对齐 key,结果实际字符串里多了制表符或不等宽空格,解析器可能不认。
使用场景:构造测试用的 JSON 字符串、嵌入式配置片段。
- 避免用 Tab 缩进——不同编辑器显示宽度不同,建议全用空格
- 如果需要严格控制格式(如校验 JSON 结构),先用文本块写,再套一层
new JSONObject(...).toString(2)(需依赖 org.json)做美化 - XML 场景更危险:文本块里的换行会被当作文本节点,可能意外触发
Node.TEXT_NODE,调试时容易漏看
最麻烦的其实是混合场景:比如文本块里插 String.format 或 STR."""..."""(Java 21 后的字符串模板),缩进规则和变量替换时机容易互相干扰,这时候宁可拆成两步——先构建干净字符串,再套进文本块。










