[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
質問
次のコードは "Hello World!" という出力を生成します(いや、本当に試してみてください)。
public static void main(String... args) {
// The comment below is not a typo.
// \u000d System.out.println("Hello World!");
}
この理由は、Java コンパイラが Unicode 文字の
\u000d
を改行として取得し、変換されます。
public static void main(String... args) {
// The comment below is not a typo.
//
System.out.println("Hello World!");
}
その結果、コメントが実行されることになります。
これは、悪意のあるコードや邪悪なプログラマーが思いつくものを隠すために使われることがあるからです。 なぜコメントで許されるのか ?
なぜJavaの仕様ではこれが許されるのですか?
どのように解決するのですか?
Unicodeのデコードは、他のどの字句変換よりも先に行われます。これの重要な利点は、ASCIIと他のどのエンコーディングの間でも、行ったり来たりするのが簡単になるということです。コメントがどこで始まり、どこで終わるかを把握する必要さえありません。
で述べたように JLSセクション3.3 これにより、ASCIIベースのツールでソースファイルを処理することができます。
[...] Javaプログラミング言語は、Unicodeで書かれたプログラムをASCIIに変換する標準的な方法を規定しており、プログラムをASCIIベースのツールで処理できる形に変更します。[...]
これは、Javaプラットフォームの重要な目標であったプラットフォームの独立性(サポートする文字セットの独立性)を根本的に保証するものです。
ファイルのどこにでもUnicode文字を書くことができるというのは、すてきな機能で、特にコメントでは、非ラテン言語でコードを文書化するときに重要です。このような微妙な方法でセマンティクスに干渉することがあるという事実は、(残念な)副作用に過ぎません。
このテーマには多くのゴチャゴチャがあり Java パズラー Joshua BlochとNeal Gafterによる以下のような変種が含まれていました。
これは合法的なJavaプログラムですか?もしそうなら、それは何を表示するのでしょうか?
\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020 \u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079 \u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020 \u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063 \u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028 \u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020 \u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b \u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074 \u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020 \u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b \u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d
(このプログラムは、単なる "Hello World" プログラムであることがわかります)。
パズドラの解答では、次のように指摘されています。
<ブロッククオートさらに言えば、このパズルは、前の3つのパズルの教訓を補強する役割を担っています。 Unicodeエスケープは、他の方法では表現できない文字をプログラムに挿入する必要がある場合に不可欠です。それ以外の場合は避けてください。
関連
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
javaの模造品QQ WeChatのチャットルーム
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
Javaエラーメッセージがenclosingクラスでない
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SpringBootApplication を型解決できない。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
プロローグでのコンテンツは禁止されています
-
Methodのinvokeメソッド実装のJavaリフレクション
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
org.glassfish.jersey.servlet.ServletContainer
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
[解決済み] Java 8のインターフェイスメソッドで "final "が使えないのはなぜですか?