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”)。

通过命令行提供的参数不是仅被视为字符串吗?

我知道它不能引发编译器错误,因为命令行提供的参数是编译阶段之后,但它不应该引发运行时异常或其他什么吗?

还是一旦我们通过了编译阶段,String 包含什么就无关紧要了(因为代码被转换成字节码并且整个代码结构都被改变了)?如果是,那么有人可以详细说明。

提前谢谢!!

4

3 回答 3

2

加倍反斜杠只是语法问题。在 Java 代码中,要在引号内表示单个反斜杠,您必须键入两次。但是,您真正代表的是一个反斜杠。

当您通过命令行传递它时,您不需要转义,因为它不是 Java 代码。

于 2012-05-24T17:58:42.693 回答
1

您没有意识到 shell 命令行和 Java 是两种不同的语言。给 shell 的命令行被解析为 shell 命令。给定的 Java 程序java被解析为 Java。

您可能还会混淆字符串文字(产生字符串的代码段)和字符串(由字符序列组成的值)。

您希望将两个字符串 \d存储在 variable 中s。您需要构造一个适当的字符串文字才能做到这一点。

  • 要生成两个字符串\d,可以使用 cmd (Windows shell) 字符串文字\d
  • 要生成两个字符串\d,可以使用 Java 字符串文字"\\d"
于 2012-05-24T18:09:44.313 回答
1

通过命令行提供的参数不是仅被视为字符串吗?

是的,它们是字符串。字符串对象。没关系。

但是,在代码中,您有字符串文字。这些由 Java 编译器解析以在执行时生成 String对象。转义是 Java 语言的一部分,而不是String 对象的一部分。

(请注意,其他一些库 - 特别是正则表达式 - 也可能自己的转义机制,但基本上如果你运行

java Foo \d

然后假设你的shell没有做任何有趣的事情(这将取决于那个 shell!)然后你最终得到一个两个字符串:一个反斜杠,后跟一个d.

于 2012-05-24T18:01:00.237 回答