Java 引发StringIndexOutOfBoundsException

Java 引发StringIndexOutOfBoundsException,java,indexing,parameters,substring,Java,Indexing,Parameters,Substring,很抱歉,如果已经问过这个问题,我刚刚抛出了一个“java.lang.StringIndexOutOfBoundsException”,尽管我的程序在第一次尝试时运行正常。我试图更改子字符串的索引,但它也不起作用。下面是引发的完整异常: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 8, end 17, length 9 at java.base/java.lang.String.checkB

很抱歉,如果已经问过这个问题,我刚刚抛出了一个
“java.lang.StringIndexOutOfBoundsException”
,尽管我的程序在第一次尝试时运行正常。我试图更改子字符串的索引,但它也不起作用。下面是引发的完整异常:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 8, end 17, length 9
at java.base/java.lang.String.checkBoundsBeginEnd(Unknown Source)
at java.base/java.lang.String.substring(Unknown Source)
at platerecognition.PlateRecognition.main(PlateRecognition.java:31)
以下是台词:

public class Asserv {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws FileNotFoundException {

   final File folder = new File("./Verr");

   PrintWriter pw = new PrintWriter(new File("Gel.csv"));

   for (final File fileEntry : folder.listFiles()) {
    if (!fileEntry.isDirectory()) { 
        String filename = fileEntry.getName();
        String date = filename.substring(0, 8);
        System.out.println(date);
        String time = filename.substring(8,17);
        System.out.println(time);
        int index = filename.indexOf("_", 19);
        String plate = filename.substring(18,index);
        System.out.println(plate);        
        int index2 = filename.indexOf("-", index+2);
        String cam = filename.substring(index+4, index2);
        System.out.println(cam);
        String last = filename.substring(index2 + 1, filename.indexOf('.', index2 + 1));
        System.out.println(last);
        System.out.println(fileEntry.getName());

您可以按如下方式阅读异常消息
开始8,结束17,长度9

您要求从8(开始)到17(结束)的
子字符串
,但当前长度为9

抛出:

IndexOutOfBoundsException-如果beginIndex为负数,或endIndex大于此字符串对象的长度,或beginIndex大于endIndex

您需要检查
字符串的长度
,以防止出现此异常。比如:

int begin = 8;
int end = 17;
s.substring(begin, Math.min(s.length(), end));
我使用
Math.min(s.length(),end)
来获得最低值,它将是
end
或该
字符串的限制

注意:如果
开始
大于
结束
(或长度),则会出现相同的问题。所以这不是完全安全的,但你明白了

这里有一个快速的方法

public static String substring(String s, int begin, int end){
    //Prevent out of bounds by stopping at the end of the `String`
    end = Math.min(end, s.length());

    return s.substring(begin, end);
}

filename
的值是多少?您可以发布时间值吗?您的最终索引必须是请将代码放入问题而不是注释中,并显示实际值,而不仅仅是创建值的代码。对不起,现在已经完成了从8到17的子字符串的长度正好是9,所以我不认为它走得太远了我相信
length
是调用
substring
字符串的长度,而不是子字符串本身的长度。我不得不猜测,因为此消息取决于使用的JDK。但是
String.substring
中的文档非常明确。我调用substring的字符串长度是20,也不太远,我也不明白的是,程序在第一次尝试时工作正常。你说的“first try”@YacineWalid是什么意思?我是说第一次运行时