2015-10-06 23 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