[英]Problems With StringIndexOutOfBoundsException
我必須創建一個數字記憶游戲,但是如果用戶輸入錯誤的數字,則會得到StringIndexOutOfBoundsException
。 我看了很多示例,但仍然不知道如何解決它。 這是在actionPerformed
方法中發生的,此行代碼為newNumber = answer.substring(counterOne, counterTwo);
任何幫助將不勝感激。
import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MemoryGame extends Applet implements ActionListener, Runnable {
private Label prompt;
private Button button;
private TextField input, numDisplay;
private int arrayCounter = 3, backgroundColor =0;
private int[] myArray = new int[arrayCounter];
private int[] compare = new int[arrayCounter];
private Thread delayThread;
private boolean running = true, isCompare;
public void init(){
prompt = new Label("Enter the numbers!");
input = new TextField(20);
numDisplay = new TextField(20);
numDisplay.setEditable(false);
button = new Button("Enter");
add(prompt);
add(input);
add(numDisplay);
add(button);
button.addActionListener(this);
populateArray();
delayThread = new Thread(this);
delayThread.start();
}
public void paint(Graphics g){
if(backgroundColor == 1){
setBackground (Color.green);
}
else if(backgroundColor == 2){
setBackground (Color.red);
}
}
public void populateArray() {
GenerateNumbers a = new GenerateNumbers();
myArray = a.returnArray();
int count = 1;
for(int i = 0; i < myArray.length;i++){
System.out.println("index: " + count + " : " + myArray[i]);
count++;
numDisplay.setText(" ");
} //for testing purpose
}
@Override
public void actionPerformed(ActionEvent e)throws StringIndexOutOfBoundsException {
String answer ="", newNumber="";
String[] stringArray = new String[arrayCounter];
int counterOne = 0, counterTwo = 2;
try{
answer = input.getText();
for(int i = 0; i < arrayCounter;i++){
newNumber = answer.substring(counterOne, counterTwo);
stringArray[i] = newNumber;
counterOne += 3;
counterTwo += 3;
}
}catch(NumberFormatException ex){
ex.printStackTrace();
}
for(int i = 0; i < arrayCounter;i++){
compare[i] = Integer.parseInt(stringArray[i]);
}
for(int i = 0; i < arrayCounter;i++){
if(myArray[i] != compare[i]){
backgroundColor = 2;
input.setText("Wrong");
repaint();
}
else{
backgroundColor =1;
input.setText("RIGHT!");//testing
repaint();
}
}
}
public void destroy(){
running = false;
}
@Override
public void run() {
while(running){
String numberString = "" ,stringTwo = " ";
for(int i = 0; i < arrayCounter;i++){
numberString += myArray[i] + stringTwo;
numDisplay.setText(numberString);
}
try{
delayThread.sleep(3500);
}catch(InterruptedException e){
e.printStackTrace();
Thread.currentThread().interrupt();
}
numDisplay.setText(" ");
destroy();
}
}
}
在調用answer.substring(counterOne, counterTwo)
,必須確保0 <= counterOne < answer.length()
和counterTwo <= answer.length()
。
如果the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex
則substring
將引發IndexOutOfBoundsException
。
編輯:
讓我們嘗試解決您的問題。 以下循環的邏輯有缺陷:
answer = input.getText();
for(int i = 0; i < arrayCounter;i++){
newNumber = answer.substring(counterOne, counterTwo);
stringArray[i] = newNumber;
counterOne += 3;
counterTwo += 3;
}
如果我了解您要執行的操作,則期望輸入String(存儲為answer
)包含數字,您將創建一個包含這些數字的數組,並將其與正確數字的數組進行比較。
但是,上述循環僅在用戶的答案以“ 11x22x33 ...”開頭時才有效,因為您希望從該輸入String中提取每個包含2個字符的arrayCounter
(= 3)子字符串,並從中提取它們。字符串的位置(0,1)(3,4)(6,7)。 這意味着,如果String少於8個字符,則將得到StringIndexOutOfBoundsException
。
您不應該假設數字的長度或輸入字符串中的數字數。 更好,更簡單的解決方案是:
stringArray = answer.split(" ");
這將在空格處拆分輸入數組。 請注意,您將獲得的數組長度不一定與正確答案的長度匹配,因此您必須比較長度。
如果滿足以下任何條件,將發生IndexOutOfBoundsException
`counterOne` is negative, or
`counterTwo` is larger than the length of `answer`, or
`counterOne` is larger than `counterTwo`.
在執行answer.substring(counterOne, counterTwo)
之前answer.substring(counterOne, counterTwo)
您可以執行以下操作
if (counterOne >= 0 && counterTwo < answer.length && counterOne <= counterTwo)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.