拆分字符串并将其解析为整数

时间:2012-09-08 00:42:59

标签: java

由于某种原因,我在代码的这一部分中有一些逻辑(java.lang.ArrayIndexOutOfBoundsException)错误。我希望用户输入任何内容并将其拆分并解析为整数。如果用户没有这样做,请再次询问他们。如果他们输入类似“g5 3 76h 23”的东西,那么程序会接受它为5 3.或者如果我可以让程序拒绝这个,直到用户只输入0到9之间用空格分隔的两个数字,那就没问题了以及。用户还可以选择退出“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

2 个答案:

答案 0 :(得分:3)

您需要验证返回的token[]数组的长度,因为可能不会返回“标记”。 I.E.,在没有首先确保它们存在的情况下,您不应该尝试访问token[0]token[1]

示例检查:

if(token.length > 1)

答案 1 :(得分:1)

从扫描仪文档:

  

扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。

您可以将其更改为:

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进行值比较。