我有一个程序,它读取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[] input
和String[] args
之间有什么不同。有人能让我知道我在哪里弄错了吗?
答案 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(在此特定代码段中),您使用此行声明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][];
编辑:
我应该澄清一下,您需要在整个代码中进行此更改,因为您多次使用==
运算符,而不仅仅是在上面的代码段中。