テキストブロック(付随的空白の除去 / 末尾改行)難易度 高無料
次のコード(Java 17・テキストブロック)の出力として正しいものを選べ(行頭のドットは説明用でソースには含まれない。実際のインデントは半角スペース)。
1 String s = """
2 .... Hello
3 .... World
4 .... """;
5 System.out.print("[" + s + "]");
(2行目は先頭スペース4個 + Hello、3行目は先頭スペース6個 + World、4行目の閉じ """ は先頭スペース4個の位置にある)
- A
[Hello改行World改行](Worldの前にスペース2個・末尾に改行あり) - B
[ Hello改行World](先頭空白は保持されず末尾改行も無い) - C
[Hello改行World](末尾改行なし・]がWorldと同じ行) - D
[Hello改行World改行](Worldの前の空白まで全て除去)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
テキストブロックは「付随的空白(incidental white space)」を自動で取り除く。除去量は
全ての非空行 および 閉じデリミタ行の、共通する最小の先頭インデントで決まる(JEP 378)。
各誤答が違う理由Hello行=先頭4、World行=先頭6、閉じ"""行=先頭4。最小は 4。- 各行から先頭4スペースを剥がす →
HelloとWorld(2スペース残る)。 - 閉じデリミタが独立した行にあるため、最後の内容行(
World)の後に改行が1つ残る。
よって s は文字列 "Hello\n World\n"。"[" + s + "]" は
[Hello/ World/] の3行になる(] が単独行なのは末尾改行の証拠)。
- B付随的空白の除去が働かない前提の誤り。共通最小インデント4が剥がされ、かつ閉じデリミタ独立行ゆえ末尾改行が残る。
- C閉じ
"""が独立した行にあるため、最後の内容行のあとに改行が1つ残る。]は次の行に来る。 - D剥がすのは共通最小インデント(4)だけ。
World行は6インデントなので4を引いた残り2スペースが保持される。
ひっかけ: 2つの罠。① 付随的空白の基準に閉じ
""" の位置も含まれる(閉じデリミタを深くインデントすると剥がす量が変わる)。② 閉じデリミタが独立行だと末尾に改行が残る(""" を内容の直後に置けば末尾改行は消える)。実機確認の答え合わせ
出力(角括弧は可視化用に付与): [Hello World ]
公式ドキュメント・関連JLS SE17 §3.10.6 Text Blocks↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)