1

コード:

String s = "\d";

コンパイラエラー、不正なエスケープ文字を発生させます。はい、分かりました!!

しかし、コード:

class Test
{
public static void main(String[] args)
{
String s = args[0];
System.out.println(s);
}
}

java Test \dコマンドまたはで呼び出された場合は実行されませんjava Test "\d"。なぜ??

\d実際には、二重のバックスラッシュ( "\\ d")を使用せずに印刷することもできます。

コマンドラインから提供された引数は文字列としてのみ扱われませんか?

コマンドラインで提供される引数はコンパイル段階の後なので、コンパイラエラーを発生させることはできませんが、実行時例外などを発生させるべきではありませんか?

それとも、コンパイル段階を通過した後は、文字列に何が含まれているかは関係ありません(コードがバイトコードに変換され、コード構造全体が変更されるため)?はいの場合、誰かが詳しく説明してもらえますか。

事前にThnx!!

4

3 に答える 3

2

バックスラッシュを2倍にするのは、構文の問題だけです。Javaコードでは、引用符で囲まれた1つの円記号を表すには、2回入力する必要があります。ただし、実際に表現しているのは1つの円記号です。

コマンドラインから渡す場合、Javaコードではないため、エスケープする必要はありません。

于 2012-05-24T17:58:42.693 に答える
1

シェルコマンドラインとJavaが2つの異なる言語であることに気づいていません。シェルに指定されたコマンドラインは、シェルコマンドとして解析されます。に与えられたJavaプログラムjavaはJavaとして解析されます。

文字列リテラル(文字列を生成するコードの一部)と文字列(文字のシーケンスで構成される値)も混同している可能性があります。

2文字の文字列 \dを変数に格納する必要がありますs。そのためには、適切な文字列リテラルを作成する必要があります。

  • 2文字の文字列を生成するには\d、cmd(Windowsシェル)文字列リテラルを使用できます\d
  • 2文字の文字列を生成するには\d、Java文字列リテラルを使用できます"\\d"
于 2012-05-24T18:09:44.313 に答える
1

コマンドラインから提供された引数は文字列としてのみ扱われませんか?

はい、文字列です。文字列オブジェクト。それはいいです。

ただし、コードには文字列リテラルがあります。これらはJavaコンパイラによって解析され、実行時にStringオブジェクトが生成されます。エスケープはJava言語の一部であり、Stringオブジェクトの一部ではありません。

(他のいくつかのライブラリ(特に正規表現)にも独自のエスケープメカニズムがある場合がありますが、基本的には、

java Foo \d

次に、シェルがおかしなことを何もしないと仮定すると(シェルdによって異なります!)、2文字の文字列になります。バックスラッシュの後に。が続きます。

于 2012-05-24T18:01:00.237 に答える