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是什么意思?我是说第一次运行时