【问题标题】:StringIndexOutOfBounds Exception when trying to remove part of StringBuilder尝试删除部分 StringBuilder 时出现 StringIndexOutOfBounds 异常
【发布时间】:2021-03-03 08:04:58
【问题描述】:

我正在尝试从 StringBuilder 中删除子目录

StringBuilder mkPath = new StringBuilder("/sdcard/Downloads/mp3/mysong.mp3");

String nameToRemove = "/"+new File(mkPath.toString()).getName();

mkPath.delete(mkPath.lastIndexOf("/"),nameToRemove.length());

但它不断抛出 StringIndexOutOfBounds 异常。有没有办法解决这个问题?

【问题讨论】:

  • StringBuilder b 应该是StringBuilder mkPath
  • 是的,抱歉是个错误
  • 您应该能够编辑您的问题以修复错误

标签: java string stringbuilder


【解决方案1】:

操作文件系统路径的最简单方法是使用java.io.Filejava.nio.file.Path

File parent = new File("/sdcard/Downloads/mp3/mysong.mp3").getParentFile();

Path parent = Path.of("/sdcard/Downloads/mp3/mysong.mp3").getParent();

两者都返回不带“/mysong.mp3”的路径。

【讨论】:

    【解决方案2】:

    您将获得StringIndexOutOfBoundsException,因为mkPath.lastIndexOf("/")21nameToRemove.length()11

    替换

    mkPath.delete(mkPath.lastIndexOf("/"),nameToRemove.length());
    

    mkPath.delete(mkPath.lastIndexOf("/"), mkPath.lastIndexOf("/") + nameToRemove.length());
    

    因为end 索引必须大于start 索引。

    查看StringBuilder.#delete(int, int)了解更多详情。

    【讨论】:

      【解决方案3】:

      我认为您可以更简单地实现目标。您只是想删除从最后一个“/”到最后的所有内容,对吗?

      StringBuilder b = new StringBuilder("/sdcard/Downloads/mp3/mysong.mp3");
      
      b.delete(mkPath.lastIndexOf("/"),b.length());
      

      如另一个答案所述,delete() 的第二个参数不是要删除的字符数,而是要删除的最后一个位置。如果为此传递整个构建器内容的长度,它将删除到字符串的末尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多