命令行参数java *正在重载以获取文件名

时间:2015-01-06 01:47:45

标签: java shell cmd wildcard

我正在编写java中最简单的计算器来获取命令行参数。除了乘法函数之外,一切正常。出于某种原因,它从当前位置获取文件的名称。我完全不知道为什么会这样,以及如何关闭它...谷歌没有帮助。

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");
        }
    }
}

enter image description here

2 个答案:

答案 0 :(得分:7)

这与java无关,但是使用命令行,您需要使用:

java Calculate 2 "*" 3

原因是*被命令行解释为通配符:它被文件夹中的所有文件替换,幸运的是只有一个这样的文件。它是几乎所有(基本)shell的默认行为。如果你在单引号('*')或双引号("*")之间编写它,那么shell不会 intepret 它,而是将它作为一个字符传递。

所以基本上发生的是你的通话被 cmd 替换为:

java Calculate 2 <files in the directory> 3

换句话说,java甚至不知道你曾经使用过通配符,因为在你调用程序之前它被替换为

可以找到更多信息here(尽管该网站专为 Linux shell设计,但这些提示通常适用)。

修改

正如@PatriciaShanahan所说,您也可以将整个表达式放在引号中,例如:

java Calculate "2 * 3"

但请注意,在这种情况下,args[0]将包含"2 * 3"args的长度为1,因此您无法从中受益shell部分解析你的表达式,所以你需要自己将字符串细分为部分。你不能完全放弃引号。

答案 1 :(得分:1)

将整个计算字符串括在引号中,然后自行拆分:

java Calculate "2 * 3"

只使用*进行乘法运算。