Java日志文件读取器,charAt()字符串索引超出范围

时间:2014-02-19 09:10:23

标签: java parsing exception charat

我有问题。 我想创建一个程序,它接受一个日志文件并解析它换行。

日志看起来像这样:

  

“2014-02-14 14:26:37,836 INFO [org.jboss.msc](主要)JBoss MSC   版本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 如果不是,则Line仅是与之前的行相关的消息。

但我总是得到错误:

 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)

但他读了一些日志。但直到日志结束。

你能帮帮我吗?对不起我的英文。

2 个答案:

答案 0 :(得分: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)==':'){

答案 1 :(得分:1)

错误的原因非常简单;首先检查字符串是否有长度&gt; 1,然后直接在索引4处询问字符 - 这不能保证存在,因为你所知道的就是那个长度&gt; 1.

因此,在尝试访问索引4处的char之前添加适当的检查,最重要的是,如@VusP的注释所述,在尝试解析之前添加一些读取字符串的打印/调试。