使用integer.parseInt java时的数字格式异常

时间:2015-09-21 12:45:19

标签: java delimiter

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class reader {

    public static void main(String[] args) {

        char rbracket=')';
        char lbracket='(';
        char rsbracket=']';
        char lsbracket='[';
        String delimiter="\\D";
        String[] ar;
        char start = 0,end=0;
        int x[]=new int[2];
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)))
        {
            String c=reader.readLine();
            for(int i=0;i<c.length();i++)
            {
                if(c.charAt(i)==rbracket)start=rbracket;
                else if (c.charAt(i)==rsbracket)start=rsbracket;
                else if(c.charAt(i)==lbracket)end=lbracket;
                else if(c.charAt(i)==lsbracket)end=lsbracket;
            }
            ar=c.split(delimiter);
            System.out.println(start);
            System.out.println(end);
            for(int i=0;i<ar.length;i++)
            {
                x[i]=Integer.parseInt(ar[i].trim());
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

我正在尝试读取此格式的输入(90,100),我需要读取括号和内部范围。检查括号是( [,然后为数字(=exclusive内的数字和[=inclusive设置最小和最大范围。我正在尝试读取大括号的字符串检查,然后将字符串拆分为数字并保存为整数字符串以便使用。

但是,在分割得到数字格式异常后,我无法将字符串转换为整数字符串。请帮忙,错误在哪里?

1 个答案:

答案 0 :(得分:2)

ar=c.split(delimiter);行返回以下数组(输入"(90,100)"):

["", "90", "100"]

首先Integer.parseInt来电失败。

更好的解决方案可能是使用正则表达式来解析和验证输入并提取数字:

    String c = "(90,100)";
    int[] x = new int[2];
    Pattern p = Pattern.compile("([(\\[])(\\d+),(\\d+)([)\\]])");
    Matcher m = p.matcher(c);
    if (!m.matches()) {
        // input is invalid
        System.out.println("Bad input string: " + c);
    } else {
        // input is valid
        char start = m.group(1).charAt(0);
        char stop = m.group(4).charAt(0);
        x[0] = Integer.parseInt(m.group(2));
        x[1] = Integer.parseInt(m.group(3));
        for (int y : x) {
            System.out.println(y);
        }
    }

正则表达式的解释:

  • ([(\\[])表示匹配([字符;外括号定义capture group,它是我们可以使用m.group(1)1检索的匹配字符串的子集,因为它是正则表达式中的第一个组)。请注意,此处的第三个字符(即第二个'(')不需要使用\来转义,因为在custom character class中使用时不会将其视为特殊字符。
  • (\\d+)匹配一个或多个数字;括号定义了我们可以使用m.group(2)
  • 检索的第二个捕获组
  • ,匹配逗号
  • (\\d+)匹配一个或多个数字;括号定义了我们可以使用m.group(3)
  • 检索的第三个捕获组
  • ([)\\]])匹配)]字符;外括号定义了我们可以使用m.group(3)
  • 检索的第四个捕获组