簡體   English   中英

StringIndexOutOfBoundsException問題

[英]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 endIndexsubstring將引發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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM