处理字符串超出范围异常

时间:2015-10-06 16:18:14

标签: java

我正在通过文件进行非常基本的循环。该文件包含许多条目,但是,它似乎在第3个循环之后中断,它肯定包含超过25个字符。简单的循环如下:

public static void organiseFile() throws FileNotFoundException {
        ArrayList<String> lines = new ArrayList<>();
        String directory = "C:\\Users\\hussainm\\Desktop\\Files\\ex1";
        Scanner fileIn = new Scanner(new File(directory + "_temp.txt"));
        PrintWriter out = new PrintWriter(directory + "_ordered.txt");
        while (fileIn.hasNextLine() == true) {
            if (!fileIn.nextLine().isEmpty()) {

                lines.add(fileIn.nextLine());
                String test = fileIn.nextLine().substring(12, 25);
                System.out.println(test);
            }
        }

我不确定问题是什么,但它一直在抛出:

  

线程“main”中的异常java.lang.StringIndexOutOfBoundsException:   字符串索引超出范围:在java.lang.String.substring中为25(未知   来源)at   fedOrganiser.fedOrganiser.organiseFile(fedOrganiser.java:41)at at   fedOrganiser.fedOrganiser.main(fedOrganiser.java:31)

不确定它的问题是什么。

文件如下:

https://www.dropbox.com/s/69h1f8u387zikbp/ex1_temp.txt?dl=0

5 个答案:

答案 0 :(得分:1)

nextLine()的每次调用都会从流中读取下一行。它是nextLine(),而不是hasNextLine(),它会使流前进一行的文本。你每循环读3行。

在循环中第一次调用nextLine时,将其分配给变量并在循环的其余部分引用该变量。

String line = fileIn.nextLine();
if (!line.isEmpty()) {
    lines.add(line);
    String test = line.substring(12, 25);
    System.out.println(test);
}

顺便说一句,您无需将boolean(例如hasNextLine()返回的内容与true进行比较。只需使用boolean本身,例如:

while (fileIn.hasNextLine()) {

答案 1 :(得分:0)

您假设每行中至少包含25个字符:

String test = fileIn.nextLine().substring(12, 25);

我猜你有一些较短或空白的行。

答案 2 :(得分:0)

在进行子字符串之前,您需要检查字符串length()

答案 3 :(得分:0)

scanner.nextLine()的调用前进到下一行。你应该这样做,如果你确定每行至少有25个字符:

public static void organiseFile() throws FileNotFoundException {
        ArrayList<String> lines = new ArrayList<>();
        String directory = "C:\\Users\\hussainm\\Desktop\\Files\\ex1";
        Scanner fileIn = new Scanner(new File(directory + "_temp.txt"));
        PrintWriter out = new PrintWriter(directory + "_ordered.txt");
        while (fileIn.hasNextLine()) {
            String line = fileIn.nextLine();
            if (!line.isEmpty()) {

                lines.add(line);
                String test = line.substring(12, 25);
                System.out.println(test);
            }
        }
...
}

我不明白你要用line.isEmpty()来测试的是什么,因为只要有线就会一直存在。即使看似空的行也至少包含一个换行符。

答案 4 :(得分:0)

如果要解析的行长度少于25个字符,则抛出异常。

备注

  1. 不确定你的意图是解析每3行,但是 fileIn.nextLine()出现三次。所以你错过了三分之一。 见doc
  2.   

    使此扫描程序超过当前行并返回该输入   被跳过了。

    1. 也许这就是你要做的事情:

          Scanner in = null;
          PrintWriter out = null;
      
          try {
              URL url = this.getClass().getResource("/test_in.txt");
              File file = new File(url.getFile());
              ArrayList<String> lines = new ArrayList<>();
              in = new Scanner(file);
              out = new PrintWriter("/test_out.txt");
              int lineNumber = 0;
              while (in.hasNextLine()) {
                  String line = in.nextLine();
                  lineNumber++;
                  if (line != null && line.trim().length() > 0) {
                      lines.add(line);
                      String test = line.substring(12, line.length()<25?line.length():25);
                      System.out.println(String.format("line# %d: \t\"%s\"",  lineNumber, test));
                  }
              }
              System.out.println(String.format("last line number: %d", lineNumber));
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } finally {
              in.close();
              out.close();
          }
      
    2. 编辑:为了完整性 enter image description here