Java方法安排,运行时错误
我已经编写了一个程序,根据用户选择将令牌放入哪个列,显示放入板中的令牌。我得到一个运行时错误Java方法安排,运行时错误,java,runtime,Java,Runtime,我已经编写了一个程序,根据用户选择将令牌放入哪个列,显示放入板中的令牌。我得到一个运行时错误 java.lang.StringIndexOutOfBoundsExcepti… String index out of range: 42 at java.lang.String.substring(Unknown Source) at A1Program.extractRow(A1Program.java:83) at A1Program.start(A1Program.ja
java.lang.StringIndexOutOfBoundsExcepti… String index out of range: 42
at java.lang.String.substring(Unknown Source)
at A1Program.extractRow(A1Program.java:83)
at A1Program.start(A1Program.java:19)
at A1Application.main(A1Application.java:11…
at sun.reflect.NativeMethodAccessorImpl.inv… Method)
at sun.reflect.NativeMethodAccessorImpl.inv… Source)
at sun.reflect.DelegatingMethodAccessorImpl… Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacC…
当我运行这个程序时,我有点不知道我可能出了什么问题
我的代码是:
public class A1Program {
public void start() {
String inputString = "XOXOXOO X XXO X OXO ";
boolean gameOver = false;
String tokens = inputString;
while (!gameOver) {
int column = columnResult();
tokens = enterToken("X", tokens, column);
System.out.println(tokens);
displayBoard(extractRow(5, tokens));
displayBoard(extractRow(4, tokens));
displayBoard(extractRow(3, tokens));
displayBoard(extractRow(2, tokens));
displayBoard(extractRow(1, tokens));
displayBoard(extractRow(0, tokens));
System.out.println("---------------");
}
}
private int columnResult(){
System.out.println("Enter column for X:");
String keyInput = Keyboard.readInput();
int column1 = Integer.parseInt(keyInput);
return column1;
}
private String enterToken(String tokenSymbol, String inputString, int column){
String columnEdit = inputString.substring(column*6-6,column*…
String columnEdit1 = columnEdit.trim();
String columnEdit2 = columnEdit1+tokenSymbol+" ";
String columnEdit3 = columnEdit2.substring(0,6);
String start = inputString.substring(0,column*6-6);
String end = inputString.substring(column*6);
System.out.println(start);
return start+tokenSymbol+end;
}
private String extractRow(int row, String tokens) {
String rowString1 = tokens.substring(row, row + 1);
String rowString2 = tokens.substring(row + 6, row + 7);
String rowString3 = tokens.substring(row + 12, row + 13);
String rowString4 = tokens.substring(row + 18, row + 19);
String rowString5 = tokens.substring(row + 24, row + 25);
String rowString6 = tokens.substring(row + 30, row + 31);
String rowString7 = tokens.substring(row + 36, row + 37);
return "|" + rowString1 + "|" + rowString2 + "|"
+ rowString3 + "|" + rowString4 + "|" + rowString5
+ "|" + rowString6 + "|" + rowString7 + "|";
}
private void displayBoard(String extractRow) {
System.out.println(extractRow);
}
}
跟踪中的以下行:
java.lang.String.substring(未知源)
表明问题出在tokens.substring()
这是因为令牌的长度小于您试图提取的子字符串。您可以打印令牌的长度并自己检查如果您以更可读的格式(正确缩进的代码、格式化的堆栈跟踪等)提出问题,其他人将更有可能为您提供帮助。例外情况清楚地表明,您的问题在于调用
String.substring()
方法。您将超过字符串的长度。您是否尝试使用调试器查看出了什么问题?字符串columnEdit=inputString.substring(column*6-6,column*.应该做什么?在我的代码中不是这样的。它实际上是说“string columnEdit=inputString.substring(column*6-6,column*6);”。必须是stackoverflow格式不正确。代码中途更改令牌-令牌=enterToken(“X”,令牌,列);
,因此令牌不完全是“XOXOXOO X XXO X OXO”
但仍然比子字符串参数短。啊,我的浏览器从该字符串中删除了预期的空格。该字符串有42个字符,为了以防万一,我又添加了10个空格,使其远远超过42个字符的限制。但它仍然给我一个类似的错误:java.lang.StringIndexOutofBoundException:字符串索引超出范围:-1位于A1Program.extractRow(A1Program.java:78)位于A1Program.start(A1Program.java:24)位于A1Application.main(A1Application.java:11)位于sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)}