java.lang.StringIndexOutOfBoundsException:异常

java.lang.StringIndexOutOfBoundsException:异常,java,string,indexoutofboundsexception,Java,String,Indexoutofboundsexception,我试图读取一个日志文件,并试图打印特定日期之间的所有日志,但当我试图从日志中检索日期时,最终出现了此异常。 这是我的代码,它实际上正在打印一些日志消息 public class Teat { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub { // TODO Auto-generated method stub

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

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();
        }

    }
}

}

是的,那条线的价值是多少Jigar Joshi 3分钟前编辑

值为2013年12月12日-19秒前用户3117965

2013年12月12日
长度为11个字符
String
因此最后一个字符位于位置10(第一个字符位于索引0处),访问第11个元素将使您出界,因此出现异常


是的,那条线的价值是多少Jigar Joshi 3分钟前编辑

值为2013年12月12日-19秒前用户3117965

2013年12月12日
长度为11个字符
字符串
因此最后一个字符位于位置10(第一个字符位于0索引),访问第11个元素将使您超出范围,因此异常

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

并在处理前检查
是否(sCurrentLinet.isEmpty()&&sCurrentLinet.length()>=11)

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

Sub_string.add(sCurrentLine.substring(0, 11));
并在处理前检查
是否(sCurrentLinet.isEmpty()&&sCurrentLinet.length()>=11)

Sub_string.add(sCurrentLine.substring(0, 11));
这是一个问题。在调用
子字符串(开始、结束)
函数之前添加检查

if (sCurrentLine != null && end>= start && end <= sCurrentLine.length())
if(sCurrentLine!=null&&end>=start&&end
正在给出问题。请在调用
子字符串(开始、结束)
函数之前添加检查

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

如果(sCurrentLine!=null&&end>=start&&end您是否检查日志中的所有行是否至少有11个字符长?如果您的案例中有任何行少于11个字符,您将获得StringOutOfBoundsException。

另外,请根据@Prabhakaran的建议更改代码。

是否检查日志中的所有行是否至少有11个字符长?如果您的案例中有任何行少于11个字符,您将获得StringOutOfBoundsException。
另外,请根据@Prabhakaran的建议更改您的代码。

Sub_string.add(sCurrentLine.substring(0,11));
这里的
sCurrentLine
值是多少?我从日志文件中读取的那一行,是的,那一行的值是多少?值是2013年12月12日,为什么不使用regex?
Sub_string.add(sCurrentLine.子串(0,11))
这里的
sCurrentLine的值是多少?我从日志文件中读到的那一行,是的,那一行的值是多少?值是2013年12月12日,为什么不使用regex呢?字符串的大小大约是100+,但我还是遇到了同样的问题。这在某些情况下可能是好的,但当它是您提到的值时,它将l失败,异常停止程序在此未处理的情况下继续运行字符串的大小约为100+,但我仍然遇到相同的问题。在某些情况下,它可能是好的,但当它是您提到的值时,它将失败,异常停止程序在此未处理的情况下继续运行。这实际上是日志文件的问题不管怎么说,格式都很感谢伙计们。事实上,日志文件格式有问题。不管怎么说,谢谢伙计们