使用BufferedReader时如何避免NumberFormatException?

时间:2015-12-18 08:08:25

标签: java c io bufferedreader

我使用BufferedReader来读取用户的数据,但是它给出了NumberFormat Exception,我以某种方式给出了输入。假设在C中,我编写如下代码:

scanf("%d %d", &x, &y);

我试着像这样输入控制台: 23 45 ,它会分配如下值:

  

x = 23,y = 45

我怎样才能在java中做这样的事情。我试过这样:

BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
String line1 = br1.readLine();
String line2 = br2.readLine();
int x = Integer.parseInt(line1);
int y = Integer.parseInt(line2);

但是这给了:

  

线程中的异常" main" java.lang.NumberFormatException:用于输入   string:" 23 45"在   java.lang.NumberFormatException.forInputString(未知来源)at   java.lang.Integer.parseInt(未知来源)at   AB.main上的java.lang.Integer.parseInt(未知来源)(AB.java:23)

7 个答案:

答案 0 :(得分:1)

一个InputStreamReader就足够了:

   BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
    String line1 = br1.readLine();
    String[] args = line1.split(" ");

    if (args.length != 2) {
        throw new IllegalArgumentException("The input is wrong");
    }

    int x = getIntFromInput(args[0]);
    int y = getIntFromInput(args[1]);

并且Jan指出你需要一个转换方法:

public static int getIntFromInput(String inputString) {

    //sanity checks
    if (inputString == null || inputString.trim().length() == 0) {
        throw new IllegalArgumentException("empty or null string passed");
    }

    try {
        return new BigInteger(inputString, 10).intValueExact();
    } catch (Exception ignored) {
        throw new IllegalArgumentException(String.format("input string is not a valid integer number: '%s'", inputString));
    }
}

答案 1 :(得分:1)

如果你真的想要在同一行上传递两个参数,请在白色空格上分割线,然后分别使用每个标记:

BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));

String line1 = br1.readLine();

String[] tokens = line1.split("\\s+") 

int x = Integer.parseInt(tokens[0]);
int y = Integer.parseInt(tokens[1]);

答案 2 :(得分:1)

readLine()读取,直到有换行符,通常意味着用户按下了回车键。

如果你输入12 34,这是一行,一行不像整数那样格式化。

您可以使用read()一次读取一个字符,手动拆分行并解析结果,或者最好使用Scanner类。它有一个更面向用户IO的api,暴露了诸如nextInt()next()之类的方法(返回下一个"令牌"而不是下一个char)等等。

Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();

答案 3 :(得分:1)

现在我们在这里 - 很多很多答案只是解释了如何阅读正确的输入。但是你会得到NumberFormatExceptions任何其他奇怪的方式。就像你输入的那样......

98765432109876543210 9876543210987654321 

这会反过来抛出NumberFormatException,因为它们太大而无法容纳int

因此,虽然在" "拆分并手动寻址令牌是一个很好的建议,但如果仅提供一个号码,您也会遇到ArrayIndexOutOfBounds。< / p>

我的建议是在进行任何进一步解析之前检查输入是否有效

Scanner s = new Scanner(System.in);
String line = s.nextLine();
Pattern p = Pattern.compile("(\\d{1,10})\\s+(\\d{1,10})");
Matcher m = p.matcher(line);
if(m.matches()) {
  long x1 = Long.parseLong(m.group(1));
  long y1 = Long.parseLong(m.group(2));
  if(x1 <= Integer.MAX_VALUE&& y1 <= Integer.MAX_VALUE) {   
    int x = (int)x1;
    int y = (int)y1;
    System.out.printf("Your input: %d / %d", x, y);
  } else {
    System.err.println("Numbers too big");
  }
} else {
  System.err.println("Input does not match criteria");
}

答案 4 :(得分:0)

你必须做那样的事情:

String in = *getline*;
String[] tab = in.split(' ');
List<int> nums = new         ArrayList<int>();

for(String a : tab){
nums.add(Integer.parseInt(a));         // or push() not remember...
}

// Your nums have your integers now

答案 5 :(得分:0)

这将解决您的目的

int x, y;
String[] input;
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String str = br.readLine();
  input = str.split(" ");

  x = Integer.parseInt(input[0]);
  y = Integer.parseInt(input[1]);

答案 6 :(得分:0)

您可以根据1个或多个空格读取文件中的数据和拆分字符串,并且可以处理由空格分隔的多个输入。

        Scanner s = new Scanner(System.in);
        String line = s.nextLine();
        //String line = "98765432109876543210 9876543210987654321   ";
        String[] splited = line.split("\\s+");

然后比较每个字符串以检查它是否是有效数字。 然后从该数字创建一个新的BigDecimal。具有内存允许的64位jvm上的BigDecimal最多可以容纳646456993个数字。

        for (int i=0;i<splited.length;i++) {

            if(splited[i].matches("[0-9]*")){

                BigDecimal num = new BigDecimal(splited[i]);
                System.out.println("num "+(i+1)+"="+num);
            }
        }



 Results
 line ="98765432109876543210 9876543210987654321   "
 num 1=98765432109876543210
 num 2=9876543210987654321

 line ="1212312312312312312312313 123432432432432423432423432"
 num 1=1212312312312312312312313
 num 2=123432432432432423432423432