命令行输入问题(Java)

命令行输入问题(Java),java,parsing,Java,Parsing,我有一个程序,它读取CFL的特定语法,并为开始符号输出单独的结果,但由于某些原因,传入命令行参数不起作用 我曾尝试在程序中使用一个名为input的String[],并使用它似乎可以提供输出,但当我尝试使用命令行中的特定命令运行程序时,会出现错误 代码如下: char[][] prod; int prodCount = 0, numProds = 0; String[] input = new String[] {"a","a","S","b","X",

我有一个程序,它读取CFL的特定语法,并为开始符号输出单独的结果,但由于某些原因,传入命令行参数不起作用

我曾尝试在程序中使用一个名为
input
String[]
,并使用它似乎可以提供输出,但当我尝试使用命令行中的特定命令运行程序时,会出现错误

代码如下:

    char[][] prod; int prodCount = 0, numProds = 0;
    String[] input = new String[] {"a","a","S","b","X",
                                   "a","a","S","a","X",
                                   "a","S","a","X"};

    for(int i = 0; i < input.length; i++) {
        if(input[i] == "X") 
            prodCount++;
    }

    if(input[input.length - 1] == "X") {
        prod = new char[prodCount + 1][1];
        prod[prod.length - 1][0] = '\0';
    } else
        prod = new char[prodCount][];

    int current = 0;
    for(int i = 0; i < input.length; i++) {
        if(input[i] == "X") {
            prod[current] = new char[numProds];
            current++; numProds = 0;
        } else
            numProds++;
    }

    int currentTerminal = 0; current = 0;
    for(int i = 0; i < input.length; i++) {
        if(input[i] == "X") {
            currentTerminal = 0;
            current++;
        }
        else {
            prod[current][currentTerminal] = input[i].charAt(0);
            currentTerminal++;
        }
    }

    for(int i = 0; i < prod.length; i++) {
        for(int j = 0; j < prod[i].length; j++) {
            if(prod[i][j] == '\0')
                System.out.print("E");
            else
                System.out.print(prod[i][j]);
        }
        System.out.println();
    }
然而,当我尝试从命令行使用输入时,我得到

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
             Line 36
这是上面的错误所指向的行

prod[current][currentTerminal] = args[i].charAt(0);

我不确定
String[]input
String[]args
之间有什么不同。有人能告诉我哪里出错了吗?

您的索引超出了范围:
for(int j=0;j

因为
prod
是一个新的空数组,定义如下:

  if(input[input.length - 1] == "X") { //This is the problem line
    prod = new char[prodCount + 1][1];
    prod[prod.length - 1][0] = '\0';
} else
    prod = new char[prodCount][];
您不能使用
==
比较字符串。由于此比较的结果总是为FALSE(在此特定代码段中),因此您使用以下行声明
prod
prod=new char[prodCount][]
每次。请注意,代码中没有其他地方可以更改此数组或为其分配任何内容。因此,当您尝试访问不存在的索引时,您将收到超出范围的消息

将代码更改为使用String::equals(),如下所示:

  if(input[input.length - 1].equals("X") { //Here's the fix
    prod = new char[prodCount + 1][1];
    prod[prod.length - 1][0] = '\0';
} else
    prod = new char[prodCount][];
编辑:


我应该澄清一下,您需要在整个代码中进行此更改,因为您多次使用
=
运算符,而不仅仅是在上面的代码段中。

尝试在调试模式下检查。将breackpoint放在第36行。显示代码,您在哪里解析命令行参数,以及如何从命令行运行程序。
 args
由命令行中的信息填充。因此,如果您只是用
java MyClass
而不是
java MyClass arg1 arg2 arg3 arg4
来运行程序,那么
args
中永远不会有任何元素。@Makoto这有点超出了我的教育范围,但感谢您的链接。我确实是这么想的在他的情况下,我总是会计算为false。我甚至在写这篇文章的时候考虑过,可能有一些情况下,你可以使用
==
和字符串来得到一个true。好吧,一般来说,你在第二个链接中对实习的描述要好得多,现在我相信我理解了。再次感谢你。如果可以的话,我会给你+1。我已经做到了更正,我的代码似乎可以使用
input
,但不能使用命令行参数:/我在调用
java LoadGrammar
时尝试使用字符串
aasbxasax
,但在
else
语句周围的最后一个
for
循环块中,我不断得到
ArrayIndexOutOfBounds
错误
  if(input[input.length - 1].equals("X") { //Here's the fix
    prod = new char[prodCount + 1][1];
    prod[prod.length - 1][0] = '\0';
} else
    prod = new char[prodCount][];