使用Integer.parseInt时的Java NumberFormatException(String arg)

时间:2014-02-16 15:52:26

标签: java parsing numberformatexception

尝试将String的最后一部分解析为整数时,我得到NumberFormatException。例外打印如下:

Exception in thread "main" java.lang.NumberFormatException: For input string: "95
"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at GradeBook.parseDataToStudentArray(GradeBook.java:85)
    at GradeBook.main(GradeBook.java:12)

我正在运行for循环,将长字符串分解为多个部分,然后从这些部分创建对象。这是方法:

private static Student[] parseDataToStudentArray(String data)
    {
        Student[] students = new Student[10];
        System.out.print(data);
        for (int i=0;i<10;i++)
        {
            String tempStudent = data.substring(0,data.indexOf("\n"));
            data=data.substring(data.indexOf("\n")+1);
            String firstName= tempStudent.substring(0,tempStudent.indexOf(" ")); 
            tempStudent = tempStudent.substring(tempStudent.indexOf(" ")+1);
            String lastName= tempStudent.substring(0,tempStudent.indexOf("  "));
            tempStudent = tempStudent.substring(tempStudent.indexOf("   ")+1);
            int hw= Integer.parseInt(tempStudent.substring(0,tempStudent.indexOf("  ")));
            tempStudent = tempStudent.substring(tempStudent.indexOf("   ")+1);
            int quiz= Integer.parseInt(tempStudent.substring(0,tempStudent.indexOf("    ")));
            tempStudent = tempStudent.substring(tempStudent.indexOf("   ")+1);
            int project= Integer.parseInt(tempStudent.substring(0,tempStudent.indexOf(" ")));
            tempStudent = tempStudent.substring(tempStudent.indexOf("   ")+1);
            int midterm= Integer.parseInt(tempStudent.substring(0,tempStudent.indexOf(" ")));
            tempStudent = tempStudent.substring(tempStudent.indexOf("   ")+1);
            int finalExam= Integer.parseInt(tempStudent); 
            tempStudent = tempStudent.substring(tempStudent.indexOf("   ")+1);
            students[i] = new Student(firstName,lastName,hw,quiz,project,midterm,finalExam);
        }
        return students;
    }

非常感谢您的帮助!

我从字符串数据开始,如果我     是System.out.print(数据) 产生

John Smith  92  80  86  76  95
Mary Lamb   66  89  92  100 56
Katy Perry  80  75  89  83  90
Mile Johnson    90  92  95  91  88
Jefferson Hue   75  78  70  82  73
Gabby Alden 83  79  88  94  92
Rubby Barry 89  82  75  90  86
Brian Wilson    78  83  81  89  90
Davis Brown 92  78  50  77  84
Alfred Williams 87  93  67  82  95

2 个答案:

答案 0 :(得分:3)

我强烈建议您使用返回数组的String#split。由于名称和第一个数字之间的空格数不同,因此可以使用split("\\s+")拆分多个空格。例如

String line = "John Smith  92  80  86  76  95";
String[] tokens = line.split("\\s+");

split将返回

tokens = { "John", "Smith", "92", "80", "76", "95" };

前两个索引创建名称并解析其余索引。因为每一行都有相同数量的标记,所以它应该在循环中正常工作。

String firstName = tokens[0];
String lastName = tokens[1];
int hw = Integer.parseInt(tokens[2]);
...

注意请参阅下面的@janos评论,了解相同功能的其他选项

答案 1 :(得分:0)

显然,附加到95的换行符会混淆Integer.parseInt,因此您应该首先清除任何尾随空格的字符串。