【问题标题】:Why .substring() does not work well in my java project?为什么 .substring() 在我的 java 项目中不能正常工作?
【发布时间】:2016-09-06 04:30:24
【问题描述】:

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

【问题讨论】:

  • 你肯定有一个错误:line != " " 需要变成!" ".equals(line)
  • 仍然得到相同的异常@npinti
  • 这并不能回答您关于子字符串的问题,但您可以使用!line.startsWith(id) 而不是!line.substring(0, 6).equals(id) 以避免在检查您的条件时出现很多问题。

标签: java string file csv


【解决方案1】:

您的代码正在进行以下调用line.substring(0, 6),如果line.length() < 6String#subString 的javadoc 中所述,这可能是IndexOutOfBoundsException 的原因:

投掷: IndexOutOfBoundsException - 如果beginIndex 为负数,或者endIndex 大于此String 对象的长度,或者beginIndex 大于endIndex

您可以按如下方式更改您的if 语句以避免此问题:

if (line.length() >= 6 && !line.substring(0, 6).equals(id)) {
    sb.append(line);
}

不相关:

由于您正在检查line != null 是否在while 条件中,因此完全没有必要在第一个if 中再次检查它。

【讨论】:

    【解决方案2】:

    如果该行少于 6 个字符,您的代码将失败。 Java 在String 中有一个不同的方法,当您想要检查一个字符串是否以其他字符串开头时,它会更方便,因为它无需先检查长度即可工作。那个方法是String.startsWith

    if (!line.startsWith(id)) {
        sb.append(line);
    }
    

    【讨论】:

      【解决方案3】:

      异常必须来自System.out.println(line.substring((5)));,因为当String#substring(int) 验证参数时,它会从字符串的长度中减去它。如果line 的长度为零,它将看到0 - 5 < 0 并抛出异常。您可以将该行移动到以下条件块的内部,但之后您需要进一步调试。

      【讨论】:

        【解决方案4】:

        当字符串比子字符串的开头短时抛出IndexOfBounds。您应该在子字符串之前检查字符串长度:

        if(line.length() > 5) System.out.println(line.substring((5)));
        

        【讨论】:

          猜你喜欢
          • 2014-09-28
          • 1970-01-01
          • 1970-01-01
          • 2017-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多