【问题标题】:java.lang.StringIndexOutOfBoundsException: Exceptionjava.lang.StringIndexOutOfBoundsException:异常
【发布时间】:2014-01-07 14:24:14
【问题描述】:

我正在尝试读取日志文件并尝试打印特定日期之间的所有日志,但是当我尝试从日志中检索日期时,我最终得到了这个异常。 这是我的代码,它实际上正在打印一些日志消息

public class Teat {


public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    {
        // TODO Auto-generated method stub
        SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy");
        BufferedReader br = new BufferedReader(new FileReader(
                "C:\\log.log"));
        String sCurrentLine;
        try {
            String startDate = "12 Dec 2013";
            String endDate = "12 Dec 2013";

            Date dateStart = formatter.parse(startDate);
            Date dateEnd = formatter.parse(endDate);
            Date logDate = null;
            int sDay = dateStart.getDate();
            int sMonth = dateStart.getMonth();
            int sYear = dateStart.getYear();
            int eDay = dateEnd.getDate();
            int eMonth = dateEnd.getMonth();
            int eYear = dateEnd.getYear();
            String date;
            int i=0;
              ArrayList<String> Sub_string = new ArrayList<String>();
            do {
                sCurrentLine = br.readLine();
                Sub_string.add(sCurrentLine.substring(0, 11));

                logDate = formatter.parse(Sub_string.get(i));
                int lDay = logDate.getDate();
                int lMonth = logDate.getMonth();
                int lYear = logDate.getYear();
                if (lYear >= sYear && lYear <= eYear) 
                {
                    if (lMonth >= sMonth && lMonth <= eMonth)

                    {
                        if (lDay >= sDay && lDay <= eDay) {
                            System.out.println(sCurrentLine);
                        }
                    }
                }
                else{System.out.println("pls ented valid dates");}
                i++;
            }while(sCurrentLine!=null);
        }

        catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }
}

}

错误是

 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index 
out of range: 11
    at java.lang.String.substring(Unknown Source)
    at Teat.main(Teat.java:41)

【问题讨论】:

  • Sub_string.add(sCurrentLine.substring(0, 11)); sCurrentLine 这里的值是多少?
  • 我从日志文件中读取的行,
  • 是的,那行的值是多少?
  • 值为 2013 年 12 月 12 日
  • 你为什么不使用正则表达式呢?

标签: java string indexoutofboundsexception


【解决方案1】:

更改 whlie((sCurrentLine = br.readLine())!=null) 而不是 do while 否则您将以 NullPointerException 结尾。

并在处理前检查if(sCurrentLinet.isEmpty()&amp;&amp;sCurrentLinet.length()&gt;=11)

【讨论】:

    【解决方案2】:

    是的,那条线的价值是多少? – Jigar Joshi 3 分钟前编辑
    该值为 2013 年 12 月 12 日 – user3117965 19 秒前

    12 Dec 2013 是 11 个字符长 String 所以最后一个字符在位置 10(第一个字符在 0 索引处),访问第 11 个元素会让你超出界限,所以异常

    【讨论】:

    • 字符串的大小约为 100+,但我仍然遇到同样的问题
    • 在某些情况下可能会很好,但是当它是您提到的值时,它将失败,并在这种未处理的情况下停止程序继续进行。
    【解决方案3】:
    Sub_string.add(sCurrentLine.substring(0, 11));
    

    给出问题。在调用substring(start, end)函数之前添加一个检查

    if (sCurrentLine != null && end>= start && end <= sCurrentLine.length())
    

    【讨论】:

      【解决方案4】:

      您是否检查了日志中的所有行是否至少有 11 个字符长?如果在您的情况下任何行少于 11 个字符,您将收到 StringOutOfBoundsException。 另外请根据@Prabhakaran 的建议更改您的代码。

      【讨论】:

      • 这实际上是日志文件格式的问题,谢谢大家
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多