Java StringIndexOutOfBoundsException:循环中字符串索引超出范围32

Java StringIndexOutOfBoundsException:循环中字符串索引超出范围32,java,for-loop,substring,Java,For Loop,Substring,这个错误很难调试。它也不是经常发生。有人能帮忙吗?子字符串方法是否可能已损坏 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 32 at java.lang.String.substring(String.java:1765) at mmk.basej.main(basej.java:186) Error in lin

这个错误很难调试。它也不是经常发生。有人能帮忙吗?
子字符串
方法是否可能已损坏

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 32
        at java.lang.String.substring(String.java:1765)
        at mmk.basej.main(basej.java:186)

Error in line: "tmp1 = filePathShort1.substring(0, 10)"
这是我的密码:

            String tmp = null;              
            String pdf_name = null;
            for (int z = 0; z < list_chek.length; z++) {                
                if (list_chek[z].toString().indexOf("pdf") > 0 | list_chek[z].toString().indexOf("tif") > 0 | list_chek[z].toString().indexOf("jpg") > 0) {
                    String filePath1 = new String();
                    String filePathShort1 = new String();
                    String tmp1 = null;
                    filePath1 = dir + list_chek[z].toString();
                    filePathShort1 = list_chek[z].toString();
                    tmp1 = filePathShort1.substring(0, 10)
                            + filePathShort1.substring(20, filePathShort.indexOf("tsd7")-1)
                            + "_"
                            + filePath1.substring(
                                    filePath1.indexOf("tsd7"), filePath1
                                            .length() - 4);

                    if (name_no_time.equals(tmp1)) {
                        //System.out.println(name_no_time+" ----   "+tmp1);
                        System.out.println("PDF_NAME " + list_chek[z].toString());
                        pdf_name = list_chek[z].toString();
                    }
                    else if ((list_chek[z].toString().indexOf("jpg") > 0) && ((name_no_time + "_1").equals(tmp1))) { 
                        System.out.println("JPG_NAME " + list_chek[z].toString());
                        pdf_name = list_chek[z].toString();
                    }               
                }
            }
字符串tmp=null;
字符串pdf_name=null;
对于(intz=0;z0 | list|chek[z].toString().indexOf(“tif”)>0 | list|chek[z].toString().indexOf(“jpg”)>0){
String filePath1=新字符串();
String filePathShort1=新字符串();
字符串tmp1=null;
filePath1=dir+list_chek[z].toString();
filePathShort1=list_chek[z].toString();
tmp1=filePathShort1.子字符串(0,10)
+filePathShort1.substring(20,filePathShort.indexOf(“tsd7”)-1)
+ "_"
+filePath1.substring(
filePath1.indexOf(“tsd7”),filePath1
.长度()-4);
如果(名称、否、时间等于(tmp1)){
//System.out.println(名称\编号\时间+“----”+tmp1);
System.out.println(“PDF_NAME”+list_chek[z].toString());
pdf_name=list_chek[z].toString();
}
如果((list_chek[z].toString().indexOf(“jpg”)>0)和((name_no_time+“_1”).equals(tmp1)){
System.out.println(“JPG_NAME”+list_chek[z].toString());
pdf_name=list_chek[z].toString();
}               
}
}
如果list_chek[z].toString的长度小于10,则
子字符串(0,10)
比提供的字符串长。这就是索引越界的原因。它试图引用超出
tmp1
边界的元素。
如果列表_chek[z]<20,则在下一行中会遇到相同的问题。在调用子字符串之前,您需要检查字符串长度。

StringIndexOutfBounds非常简单。此外,我认为不可能是
tmp1=filePathShort1.substring(0,10)
导致了您的错误,因为,从字符串方法抛出,指示索引为负或大于字符串大小。对于charAt方法等某些方法,当索引等于字符串大小时也会引发此异常。。您的错误很可能是由于代码中的另一行造成的。这与tmp1计算有关。tmp1=2017-02-02005002801AFAC_tsd7和filePathShort1=2017-02-02_15-32-46_005002801AFAC_tsd7.pdfSo如果
filePathShort1=2017-02-02_15-32-46_005002801AFAC_tsd7.pdf
和tmp1必须类似:
2017-02-020050028002801AFAC_tsd7
我必须使用
tmp1=FileShort1.substring(0,9)
相反,字符串的大小是固定的:
filePathShort1=2017-02-02_15-32-46_005002801AFAC_tsd7.pdf
tmp1=2017-02-020050028001afac_tsd7
您确定它们的长度和长度都相同吗?您可能希望插入调试语句以进行检查。事实上,它有时有效,有时无效,但有例外,这是一个强烈的迹象,表明它们都不够长。
是一个二进制的
,我想你想要逻辑的,
|
你也可以用
.contains(“pdf”)
代替
.indexOf(“pdf”)>0
字符串足够长。我只有在大文件列表中才会出现这个错误。然后我把列表分成几个小部分,程序就可以很好地处理它们了。
filePathShort1 = list_chek[z].toString();
tmp1 = filePathShort1.substring(0, 10)