为什么.substring()在我的java项目中不能很好地工作?

时间:2016-09-06 04:30:25

标签: java string file csv

我正在尝试使用此功能从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

4 个答案:

答案 0 :(得分:2)

您的代码正在进行以下调用line.substring(0, 6),这可能会导致IndexOutOfBoundsException line.length() < 6String#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)));