2015-10-06 41 views
0

我正在通过文件进行非常基本的循环。该文件包含许多条目,但是,它似乎在第三个循环之后中断,该循环肯定包含超过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: 字符串索引超出的范围:在25 java.lang.String.substring(未知 源)在 fedOrganiser.fedOrganiser.organiseFile(fedOrganiser.java:41)在 fedOrganiser.fedOrganiser.main(fedOrganiser.java:31)

不知道它的问题是什么。

文件如下:

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

+0

请编辑您的问题并添加您尝试阅读的文件的内容。 –

+0

检查您的C:\\ Users \\ hussainm \\ Desktop \\ Files \\ ex1_temp.txt文件。检查每一行是否长达25个字符? –

+2

每次检查文件是否有下一行时,您还要调用nextLine()3次。 nextLine()返回**下一行**,每次调用它时。 –

回答

0

你假设每行中有至少25个字符与线:

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

我猜你有一些线路短或空白。

0

在执行子字符串之前,您会检查字符串length()

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()) { 
+0

Doh!我只是注意到了。感谢:) –

+0

所有的真实,但抛出异常,因为解析的行少于25个字符。 –

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()测试,因为这将是只要有总是正确的是线条。即使是看似空白的行也至少包含换行符。

0

如果您正在解析的行长度小于25个字符,则会引发异常。

注意

  1. 不知道你的意图是每3行解析,但 fileIn.nextLine()出现三次。所以你错过了三条中的一条。 见doc

此扫描器执行当前行,并返回输入的是 被跳过。

  • 也许这就是你正在尝试做的:

    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(); 
        } 
    
  • 编辑:对于完整性 enter image description here