- 締切済み
コメントアウトされたエスケープシーケンスについて
Java初心者です。 コメントアウトされた中のエスケープシーケンスの使い方について質問があります。 class sample{ public static void main(String args[]){ System.out.println("16進数 :\u0001") // System.out.println("16真数 :\ugggg") } } 上記のようなソースコードがあった場合、 System.out.println("16進数 :\u0001") については、当然Unicodeの16進数範囲内なので、 コンパイルエラーにならないのですが、 コメントアウトされている行 // System.out.println("16真数 :\ugggg") については、 コンパイルエラーになります。 エラーメッセージは「エスケープシーケンスが不正です。」 コメントアウトされているので、この行は無視されるものだと思っていたのですが、コンパイルエラーになるのは何故でしょうか。 どうかご教授願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- deadlock
- ベストアンサー率67% (59/87)
>おそらく、そのためにユニコードのエスケープシーケンスに関してのみは、コメント内であってもコードが16進数の範囲外だとエラーになってしまうのでしょう。 あっていますよ。試しに、\uggggを\u000Aに変えてみてください。 今度は「ダブルクォートが閉じていないよ」(意訳)とエラーが出ると思います。 \u000Aは改行なので、こういったことになります。 逆に、↓はコンパイルエラーになりそうですが、正常に動作します。 public class A { public static void main(String[] args) { System.out.print( // "\u000A"Test"); } }
// System.out.println("16真数 :?ugggg") ?uggggが16進数の範囲から外れているからでしょう。 JLS(Java Language Specification)によると、Javaのコンパイラは、ソースコードを読み込んでからコンパイルを完了するまでに以下のようなステップを踏む、とあったように記憶しています。 ユニコード変換→字句解析→構文解析→コード生成 ユニコードのエスケープシーケンスは、最初のユニコード変換のところで処理されます。つまり、具体的な字句や構文の解析(ここで、その行がコメントかどうかチェックされる)より前にユニコード変換は行われるようです。 おそらく、そのためにユニコードのエスケープシーケンスに関してのみは、コメント内であってもコードが16進数の範囲外だとエラーになってしまうのでしょう。 (うろ覚えなので、もし微妙に違っていたらどなたか補足を)
お礼
ありがとうございます! 解決できました!
- Uematsukouji
- ベストアンサー率10% (2/19)
こんにちは。 コメントアウトされているのにエラーになるのはおかしいですね。ひとつ気になるのは;が無いということです class sample{ public static void main(String args[]){ System.out.println("16進数 :\u0001"); // System.out.println("16真数 :\ugggg") } } 真ん中の行の最後に";"を追加してみました。
お礼
ありがとうございます! 解決できました!