Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
命令行参数中的转义序列(Java)_Java_Arrays_Command Line Arguments - Fatal编程技术网

命令行参数中的转义序列(Java)

命令行参数中的转义序列(Java),java,arrays,command-line-arguments,Java,Arrays,Command Line Arguments,据 在Java中将字符串定义为“Hello\nHello”时,它不包含“\” 性格这是换行符的转义序列:“\n”只是 一个字符 当您将此字符串用作 但是,程序(因此字符串是在外部定义的),“\n”是 解释为两个字符:“\”和“n” 为什么不编译包含转义序列的命令行参数呢?我以为命令行参数放在数组字符串[]args中了 字符串[]args将包含args[0]=“Hello\nJava” 命令行参数不是Java源代码,因此Java源代码中字符含义的规则不适用 命令行参数的解释或其他方面由命令解释器负

在Java中将字符串定义为“Hello\nHello”时,它不包含“\” 性格这是换行符的转义序列:“\n”只是 一个字符

当您将此字符串用作 但是,程序(因此字符串是在外部定义的),“\n”是 解释为两个字符:“\”和“n”

为什么不编译包含转义序列的命令行参数呢?我以为命令行参数放在数组字符串[]args中了


字符串[]args将包含args[0]=“Hello\nJava”

命令行参数不是Java源代码,因此Java源代码中字符含义的规则不适用

命令行参数的解释或其他方面由命令解释器负责;Java没有得到特别对待。例如,在大多数(全部?)Linux Shell中,\n不会在带引号的字符串中替换:

  $ echo 'a \n b'
  a \n b
除引号外,反斜杠-n的意思是“字面上的n”,这与“n”完全相同,因为“n”对shell没有任何特殊意义

 $ echo a\nb
 anb

当然,Java系统可以在命令解释器之后应用自己的处理,但大多数Linux用户会发现这让人困惑;与其他命令相比,Java命令的行为会不一致。

转义序列不会被命令外壳转换为相应的字符代码(),因此您想知道的是,为什么
Java
程序在调用它时不会对接收到的参数进行一些处理。原因很简单:按摩是任意的,可能有些用户不希望字符串被解释为人类文本;但是一个字符串,它表示转义代码的任意转换是失败的泛化的其他东西。一些例子:

  • 这些字符串是windows文件路径,如
    c:\my\folder\number\n
    ,在这里您可以找到两个
    \n
    ,如果java任意泛化为人类文本,那么这将是一个重大错误
  • 文字
    ids
    ,密码,ascii码
  • 可序列化内容的结构化表示,如xml、模型对象、专有内容等
  • 现在,如果在要编译的java代码中定义字符串,编译后所有
    \?
    都将编译成相应的转义码(作为语言的一个特性);但是您可以通过转义来告诉java编译器不要这样做,即
    \\?
    ;但这份汇编涉及到了一些问题。在运行时,所有字符串都只不过是
    char[]
    ,并且不会对它们应用任意按摩

    如果转义符中反斜杠后面的字符不是ASCII b、t、n、f、r、“,”、\、0、1、2、3、4、5、6或7,则为编译时错误。Unicode转义符\u在前面处理(§3.3)


    因此String[]args存储由命令解释器right处理的字符串。命令解释器根据自己的规则将命令行分解为参数(此时shell之间相当标准)如果该进程运行的是Java虚拟机,那么JVM可能会将其中的一些参数原封不动地传递给main()函数;我不知道JVM规范是否要求这样做,但根据经验,Linux上的Oracle实现确实如此。