我正在尝试使用此功能从CSV文件中删除一行:
public void borrarAlumno(String id) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(archivo));
StringBuffer sb = new StringBuffer("");
String line;
while ((line = br.readLine()) != null) {
//System.out.println(line.substring((5)));
if(!" ".equals(line) && line != null){
if(!line.substring(0, 6).equals(id)){
sb.append(line);
}
}
}
br.close();
FileWriter fw = new FileWriter(new File(archivo));
fw.write(sb.toString());
fw.close();
}
但是我收到了这个错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5
at java.lang.String.substring(Unknown Source
该文件的第一行是:Matricula,Nombre,Apellido
。为什么我会收到IndexOutOfBoundsException
?
答案 0 :(得分:2)
您的代码正在进行以下调用line.substring(0, 6)
,这可能会导致IndexOutOfBoundsException
line.length() < 6
如String#subString的javadoc所述{/ 1}}:
<强>抛出:强>
IndexOutOfBoundsException
- 如果beginIndex
为否定,或endIndex
大于此String对象的长度,或beginIndex
大于endIndex
。
您可以按如下方式更改if
语句,以避免此问题:
if (line.length() >= 6 && !line.substring(0, 6).equals(id)) {
sb.append(line);
}
<强>相依:强>
由于您在line != null
条件中检查while
是否完全没有必要在第一个if
中再次检查它。
答案 1 :(得分:1)
如果行短于6个字符,则代码将失败。 Java在String
中有一个不同的方法,当你想检查字符串是否以其他字符串开头时更方便,因为它可以在不检查长度的情况下工作。该方法为String.startsWith
:
if (!line.startsWith(id)) {
sb.append(line);
}
答案 2 :(得分:0)
例外必须来自System.out.println(line.substring((5)));
,因为当String#substring(int)
验证参数时,它会从字符串的长度中减去它。如果line
的长度为零,则会看到0 - 5 < 0
并抛出异常。您可以将该行移动到以下条件块的内部,但在此之后您需要进一步调试。
答案 3 :(得分:0)
当字符串短于子字符串的开头时抛出IndexOfBounds。您应该在substring:
之前检查字符串长度if(line.length() > 5) System.out.println(line.substring((5)));