为什么Java命令行中^符号后的传入参数会被忽略?
问题描述
相关代码
public class Args { public static void main(String[] args) { if(args.length != 3) { System.out.println("Wrong number of arguments"); return; } int num1 = Integer.parseInt(args[0]); // 1st argument from args int num2 = Integer.parseInt(args[2]); // 3rd argument from args String msg = args[0] + args[1] + args[2] + "="; if(args[1].equals("+")) msg += (num1 + num2); else if(args[1].equals("-")) msg += (num1 - num2); else if(args[1].equals("x")) msg += (num1 * num2); else if(args[1].equals("/")) msg += (num1 / num2); else msg = "Incorrect operator"; System.out.println(msg); } }
正常运行的命令行输出
C:\Desktop>java Args Wrong number of arguments C:\Desktop>java Args 16 + 4 16+4=20 C:\Desktop>java Args 16 - 4 16-4=12 C:\Desktop>java Args 16 x 4 16x4=64 C:\Desktop>java Args 16 / 4 16/4=4 C:\Desktop>java Args 16 # 4 Incorrect operator
异常现象
传入^作为运算符时,预期输出Incorrect operator,实际输出Wrong number of arguments,^之后的内容看起来被忽略:
C:\Desktop>java Args 16 ^ 4 Wrong number of arguments
问题解答
原因
这个现象和Java本身没有关系,是Windows命令提示符(CMD)的特殊字符规则导致的:
- 在Windows CMD中,
^是默认的转义字符,作用是取消紧随其后的特殊字符的原有功能,将其作为普通字符处理。 - 当你输入
java Args 16 ^ 4时,CMD会先对命令做解析:^会被当做转义字符处理,它后面的空格会被标记为普通字符而非参数分隔符,最终CMD实际传给Java程序的参数只有2个,不满足代码中args.length ==3的判断,所以输出了参数数量错误的提示。 - Java中的
^确实是位异或运算符,但这个场景下参数还没有到Java的处理环节,就已经被CMD提前篡改了,所以和Java的语法无关。
解决方法
如果要把^作为普通运算符参数传入程序,需要在CMD中对^本身做转义,也就是连续输入两个^:
C:\Desktop>java Args 16 ^^ 4
此时CMD会把^^转义为单个^,三个参数16、^、4会正常传入Java程序,最终输出Incorrect operator,符合预期。
内容的提问来源于stack exchange,提问作者qqq
相关产品推荐
相关产品推荐

