2

何らかの理由で、コードのこの部分にロジック (java.lang.ArrayIndexOutOfBoundsException) エラーがあります。ユーザーに何かを入力してもらい、それを分割して整数に解析してもらいたいです。ユーザーがそうしなかった場合は、もう一度尋ねます。そして、彼らが「g5 3 76h 23」のようなものを入力した場合、プログラムはそれを 5 3 として受け入れます。または、ユーザーがスペースで区切られた 0 から 9 までの 2 つの数字のみを入力するまでプログラムにこれを拒否させることができれば、それで問題ありません。同じように。ユーザーは、「q」を入力して終了するオプションもあります。ただし、実行するたびに、何も新しい配列に分割されていないように見えます。エラーが発生します。

/** 
 * Prompts the user for input
 */
public void promptUser() {

// a Scanner object that uses System.in for input.

    Scanner scan = new Scanner(System.in);

// a prompt for the user, asking them for input.

    System.out.print("Pick a coordinate [row col] or press [q] to quit: ");

//         Get input from the user, checking for errors. If the input is
//         correct (e.g., two numbers that in bounds and have not 
//         already been clicked), then call the click method for desired 
//         coordinates. If the user wants to quit the game then make sure 
//         to update the boolean state variable and print out a message.

    String input = scan.next();
    String del = "[\\s,;\\n\\t]+"; // these are my delimiters
    String[] token = input.split(del); // here i will save tokens

    int val0 = 11, val1 = 11;
    boolean tf = true;
    while(tf)
    {
    if(token[0] == "q")
        {
        isRunning = false;
                    System.out.println("Thank you for playing");
        }
    else
        {
        try
            {
            val0 = Integer.parseInt(token[0], 10);
            }
        catch (NumberFormatException nfe)
            {
            // invalid data - set to impossible
            val0 = 11;
            }
        try
            {
            val1 = Integer.parseInt(token[1], 10);
            }
        catch (NumberFormatException nfe)
            {
            // invalid data - set to impossible
            val1 = 11;
            }
        }
    if( !(((val0 >= 0) && (val0 < rows)) && ((val1 >= 0) && (val1 < cols))) )
        {
        System.out.println("Input Invalid, pick a coordinate [row col] or press [q] to quit: ");
        input = scan.next();
        for(int i=0;i<2;i++)
            {
            token = input.split(del);
            }
                }
            else if(false) //atm
                {

                }
            else
        {
                    tf = false;


                }
    click(val0, val1);
    } //while loop
} // promptUser
4

2 に答える 2

3

token[]「トークン」が返されない可能性があるため、返された配列の長さを検証する必要があります。token[0]IE の場合、最初にそれらが存在することを確認せずにアクセスしようとしないでくださいtoken[1]

チェックの例:

if(token.length > 1)
于 2012-09-08T00:45:45.197 に答える
2

スキャナのドキュメントから:

Scanner は、デフォルトで空白に一致する区切り文字パターンを使用して、入力をトークンに分割します。

次のように変更できます。

scan.useDelimiter(del); // If you want to split on more than just whitespace
while(scan.hasNext()) {
    String input = scan.next();

    if("q".equals(input)) {
        System.out.println("Thank you for playing");
        return;
    }
    // etc. Put in a list or array for use later.
}

文字列はオブジェクトであるため==、両方の文字列が同じオブジェクトである場合にのみ true を返すことに注意してください。値が同じ場合ではありません。.equals値の比較に使用します。

于 2012-10-05T06:40:08.000 に答える