根据How to use line break argument
在Java中将字符串定义为“ Hello \ nHello”时,它不包含“ \” 字符。这是换行符的转义序列:“ \ n”只是 一个字符。
使用此字符串作为您的参数时 程序,但是(因此字符串在外部定义),“ \ n”为 解释为两个字符:“ \”和“ n”。
为什么也不能编译包含转义序列的命令行参数?我以为命令行参数被放置在数组String [] args中?
并且String [] args将包含args [0] =“ Hello \ nJava”;
答案 0 :(得分:3)
命令行参数不是Java源代码,因此Java源代码中字符含义的规则不适用。
命令行参数的解释或其他内容是命令解释器的范围; Java没有被特别对待。例如,在大多数(所有?)Linux Shell中,\ n都不能用引号引起来:
render() {
const cols = items.map( (item, idx) => (
<Col key={item} lg={3}>
....
<Col>
);
const noRows = Math.ceil(items.length / 4);
const rows = Array.from(Array(noRows)).map((n, i) =>(
<Row>
{cols.slice(i* 4, (i + 1)* 4)}
</Row>
));
return rows;
}
在引号之外,反斜杠-n表示“字面意义上的n”,与“ n”相同,因为“ n”在外壳上没有任何特殊之处。
$ echo 'a \n b'
a \n b
当然,Java系统可以在命令解释器之后应用其自己的处理程序,但是大多数Linux用户会感到困惑。与其他命令相比,Java命令的行为会不一致。
答案 1 :(得分:0)
转义的序列没有被命令shell转换为它们相应的字符代码(How can I echo a newline in a batch file?),所以您想知道为什么java
程序在调用时不对接收到的参数做一些按摩处理它。好吧,原因很简单:按摩是任意,也许某些用户并不期望将字符串解释为人类文本。但是一个代表其他事物的字符串,其中转义代码的任意转换是失败的概括。一些例子:
c:\my\folder\number\n
,在那里您可以找到两个\n
,如果将Java随意地归纳为人类文本将是一个重大错误。ids
,密码,ASCII艺术,现在,如果您定义了将要编译的字符串 INSIDE java代码,则在编译之后,所有\?
都将被编译为它们相应的转义代码(该语言的功能) );但是您可以通过转义转义符\\?
来告诉Java编译器不要执行此操作;但是这个编译问题。在运行时,所有字符串只不过是char[]
,并且不会对它们进行任意按摩。
如果转义中反斜杠后的字符不是ASCII b,t,n,f,r,“,',\,0、1、2、3、4、5,则这是编译时错误,6或7。Unicode转义\ u会被更早处理(第3.3节)。