Мне нужно создать игру с памятью чисел, но если пользователь вводит неправильные цифры, я получаю StringIndexOutOfBoundsException
. Я рассмотрел множество примеров и до сих пор не могу понять, как это исправить. Это происходит в методе actionPerformed
, с этой строкой кода newNumber = answer.substring(counterOne, counterTwo);
Любая помощь будет очень оценена.Проблемы с StringIndexOutOfBoundsException
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();
}
}
}
Если мы также проверяем counterTwo больше counterOne? – StackFlowed
@StackFlowed Да, мы должны, но это уже учтено в коде OP, поскольку counterOne инициализируется 0 и counterTwo до 2, и оба они увеличиваются на 3 на каждой итерации. – Eran
Спасибо за это. И да, это то, что я пытался сделать, и полностью забыл, что существует «.split», я знал, что логика была ошибочной (что я делал предположение, что массив будет содержать числа в формате 11x22x33), но не знал, как реши это. Спасибо за помощь и совет! @Eran – Spatulord