我正在用Java语言编写最简单的计算器,它可以提取命令行参数,除了乘法功能之外,其他所有功能都可以正常工作。由于某种原因,它会从当前位置获取文件名。我完全不知道为什么会发生这种情况,以及如何将其关闭... Google毫无帮助。
public class Calculate {
public static void main(String[] args) {
System.out.println(args[0] + " " + args[1] + " " + args[2]);
if (args.length != 3) {
System.out.println("<number1> <operator> <number2>");
} else {
final int num1 = Integer.parseInt(args[0]);
final int num2 = Integer.parseInt(args[2]);
switch (args[1]) {
case "+":
System.out.println(num1 + num2);
break;
case "-":
System.out.println(num1 - num2);
break;
case "*":
System.out.println(num1 * num2);
break;
case "/":
System.out.println(num1 / num2);
break;
}
System.out.println("\n");
}
}
}
这与java无关,但是与命令行一起,您需要使用:
java Calculate 2 "*" 3
原因是*
在命令行中将其解释为通配符:它被文件夹中的所有文件替换,幸运的是只有一个这样的文件。这是几乎所有(基本)shell的默认行为。但是,如果您在单引号('*'
)或双"*"
引号()之间编写它,则外壳程序不会解释它,而是将其作为字符传递。
因此,基本上发生的是您的呼叫被cmd替换为:
java Calculate 2 <files in the directory> 3
换句话说,java
甚至不知道您曾经使用过通配符,因为在调用程序之前已将通配符替换了。
可以在此处找到更多信息(尽管该网站是针对Linux Shell设计的,但是这些想法通常适用)。
编辑
正如@PatriciaShanahan所说,您也可以将整个表达式放在引号中,例如:
java Calculate "2 * 3"
但是请注意,在这种情况下,args[0]
它将包含"2 * 3"
(并且长度为args
be 1
,因此您不能从shell解析表达式的一部分中受益),因此您需要自己将字符串细分为多个部分。而且您不会完全删除引号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句