2014-02-19 59 views
1

我遇到問題。 我想製作一個程序,它需要一個日誌文件併爲它分析行。Java日誌文件讀取器,charAt()字符串索引超出範圍

日誌看起來是這樣的:

"2014-02-14 14:26:37,836 INFO [org.jboss.msc] (main) JBoss MSC version 1.0.4.GA-redhat-1"

我的代碼:

public static void main(String[] args) throws InterruptedException { 
    try 
    { 
     String sCurrentLine; 


     BufferedReader br = new BufferedReader(new FileReader("C:\\server.log"));    

     while ((sCurrentLine = br.readLine()) != null) { 
      String datetime = ""; 
      String level = ""; 
      String category = ""; 
      String message = ""; 
      String output = ""; 

      if(sCurrentLine.length()<1){      
      } 
      else{ 
       if (sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){ 
        String[] leerzeichen = sCurrentLine.split(" "); 
        String[] leerzeichenz = sCurrentLine.split(" "); 

        datetime = leerzeichen[0] + " " + leerzeichen[1]; 
        level = leerzeichen[2]; 
        category = leerzeichen[4]; 

        int arraylength = leerzeichen.length; 

        for (int l=5; l<arraylength; l++){ 
         message = message.concat(leerzeichen[l] + " "); 
        } 
        output = datetime + level + category + message; 
       } else { 
        message = message.concat(sCurrentLine);  
        output += message; 

       } 
      } 
      System.out.println(output); 
     } 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

的計劃看,如果行的開頭是這樣的:0000-00-00 00:00: 00 如果不是,則線路只是與之前線路有關的消息。

但我總是得到錯誤:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 
at java.lang.String.charAt(String.java:658) 
at javaapplication5.JavaApplication5.main(JavaApplication5.java:38) 

但他讀取日誌的一些行。但直到日誌結束。

你能幫我嗎?對不起我的英語不好。

+1

你可以在'while'中打印'scurrentLine'來查看最後拾取的內容。這僅用於臨時調試目的。如果你可以使用調試器來檢查值,那麼更好的是 –

回答

2

你在排隊有問題:

if (sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){ 

你不能假設該行至少有4,7個或更多字符。

嘗試將其更改爲這樣:

if (sCurrentLine.length() >= 16 && sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){ 
+0

這是行得通!非常感謝你! – sagschni

+0

我很高興我能幫上忙。你可能想接受我的答案,請;-) – FazoM

1

錯誤的原因是相當簡單;你首先檢查字符串是否長度大於1,然後直接詢問索引4處的字符 - 這是不能保證存在的,因爲所有你知道的長度大於1.

因此,在嘗試訪問之前添加適當的檢查字符在索引4,最重要的是,如@VusP的評論中所述,在嘗試解析它之前,添加一些打印/調試的讀取字符串。

相關問題