Integer.valueOf()Error ArrayIndexOutOfBoundsException:

时间:2017-06-25 05:41:41

标签: java arrays integer text-manipulation

String currentLine = reader.readLine();
while (currentLine != null)
{
  String[] studentDetail = currentLine.split("");

  String name = studentDetail[0];

  int number = Integer.valueOf(studentDetail[1]);
  currentLine = reader.readLine();
}

所以我有一个这样的文件:

   student1
   student16
   student6
   student9
   student10
   student15

当我运行该程序时说: ArrayIndexOutOfBoundsException异常:1

输出应如下所示:

   student1
   student6
   student9
   student10
   student11
   student15
   student16

3 个答案:

答案 0 :(得分:0)

假设所有行都以student开头并以数字结尾,您可以阅读所有行并将其添加到list,然后sort list student之后的数字,然后print每个元素。例如:

String currentLine;
List<String> test = new ArrayList<String>();
while ((currentLine = reader.readLine()) != null)
    test.add(currentLine());
test.stream()
    .sorted((s1, s2) -> Integer.parseInt(s1.substring(7)) - Integer.parseInt(s2.substring(7)))
    .forEach(System.out::println);

输出:

student1
student6
student8
student9

如果您不想使用stream()lambda,则可以list使用自定义Comparator,然后通过{{looplist进行排序1}}并打印每个元素:

Collections.sort(test, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        int n1 = Integer.parseInt(s1.substring(7));
        int n2 = Integer.parseInt(s2.substring(7));
        return n1-n2;
    }
});

答案 1 :(得分:0)

首先,编程到List接口而不是ArrayList具体类型。其次,使用try-with-resources(或明确关闭reader块中的finally。第三,我会在循环中使用Pattern正则表达式)然后使用Matcher来查找&#34; name&#34;和&#34;数字&#34;。这可能看起来像,

List<Student> student = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(new File(infile)))) {
    Pattern p = Pattern.compile("(\\D+)(\\d+)");
    String currentLine;
    while ((currentLine = reader.readLine()) != null) {
        Matcher m = p.matcher(currentLine);
        if (m.matches()) {
            // Assuming `Student` has a `String`, `int` constructor
            student.add(new Student(m.group(1), Integer.parseInt(m.group(2))));
        }
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

最后,请注意Integer.valueOf(String)会返回Integer(然后您unbox)。这就是我在这里使用Integer.parseInt(String)的原因。

答案 2 :(得分:-1)

您的文件必须像这样

student 1
student 2
student 3

不要忘记在学生和号码之间添加空格字符。 在迭代中,您必须添加以下行: currentLine = reader.readLine(); 您可以这样拆分:String[] directoryDetail = currentLine.split(" ");而不是String[] directoryDetail = currentLine.split(""); 因为当你使用String[] directoryDetail = currentLine.split(""); student1 时,结果是一个String长度为0的字符串数组