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