【问题标题】:Error reading multiple lines of integers using BufferedReader使用 BufferedReader 读取多行整数时出错
【发布时间】:2015-07-11 07:26:33
【问题描述】:

我遇到了这个异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "55 45 65 88 "
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)

使用此代码时:

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

String line = br.readLine();
int noOfStudents = Integer.parseInt(line); //firstline contains 1 integer.

ArrayList <Integer> marks = new ArrayList<Integer>();

line = br.readLine(); //second line contains a line of integers

StringTokenizer tokens = new StringTokenizer(line, "\\s+");
// to break the line into tokens 

while (tokens.hasMoreTokens())
{
    marks.add(Integer.valueOf(tokens.nextToken())); //error here
    //when I am converting tokens into integers its giving error
}

示例输入:

4
55 45 65 88(这里,当我按下回车键时,会出现上述错误)

【问题讨论】:

  • 请编辑原始问题。
  • 请不要将异常堆栈跟踪发布到问题中。

标签: java bufferedreader


【解决方案1】:

StringTokenizer 不支持正则表达式。

StringTokenizer tokens = new StringTokenizer(line, "\\s+");
// This will look for literal "\s+" string as the token.

改用这个,

StringTokenizer tokens = new StringTokenizer(line, " "); // Just a space.

编辑:正如@MasterOdin 所指出的,StringTokenizer 的默认分隔符是空格" "。因此,以下内容也将以相同的方式工作,

StringTokenizer tokens = new StringTokenizer(line);

【讨论】:

  • 你甚至不需要 StringTokenizer 中的最后一个参数,因为它默认为空格。
【解决方案2】:

你可以选择简单的方法:

String []m=br.readLine().split(" "); // split the line delimited with space as array of string.
 for(int i=0;i<m.length;i++){
    marks.add(Integer.valueOf(m[i]));  // add to the marks array list
 }

编辑:根据 T.G

for (String s : br.readLine().split("\\s+")) {
   marks.add(Integer.valueOf(s));
}

【讨论】:

  • 有替代方案很好,但在这种情况下,我不推荐这种解决方案。最好学习使用类而不是编写自己的代码,Ofc。能够自己编写这些类是件好事;)
  • @Rustam:由于split 支持正则表达式,您可以将\\s+ 保留在那里。
  • 嗯,没注意到。你说的非常对。 split() 效率很高。但是如果可以使用foro,为什么还要使用fori循环呢?
  • @T.G 有些人仍然使用StringTokenizer since it can have a better performance,但这些情况很少见。是的,增强的for 循环在这里更好。
  • 感谢@T.G 的改进
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2015-10-03
  • 2013-10-30
  • 2015-05-12
  • 2019-01-09
相关资源
最近更新 更多