命令行输入问题(Java)

时间:2014-11-24 03:33:38

标签: java parsing

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

我尝试在程序中使用String[],名为input并使用它似乎提供输出,但是当我尝试使用命令行中的特定命令运行程序时,我得到了错误。

以下是代码:

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

将此代码与String[] input一起使用

aaSb
aaSa
aSa
E

但是,当我尝试使用命令行的输入时,我得到了......

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
             Line 36

以上是上述错误指向的行

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

我不确定String[] inputString[] args之间有什么不同。有人能让我知道我在哪里弄错了吗?

1 个答案:

答案 0 :(得分:1)

你的索引超出界限: for(int j = 0; j < prod[i].length; j++) {

因为prod是一个新的NULL数组,如下所示:

  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(在此特定代码段中),您使用此行声明prodprod = 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][];

编辑:

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