当前位置: 首页 > 知识库问答 >
问题:

StringBuilder不一致的删除方法

杜茂
2023-03-14

StringBuilder=新建StringBuilder()

builder。附加(“你好”)

builder的长度为5。所以,如果我调用builder。deleteCharAt(5)我理所当然地得到一个IndexOutOfBoundsException,但我可以调用生成器。删除(0,5),此操作将成功运行。

我不认为图书馆的创造者没有这样刻意。那么,为什么不一致?


共有1个答案

邢英奕
2023-03-14

我会说这很好。意图是不同的。

让我们试试这个例子:

String builder sb = new StringBuilder();
sb.append("hello").append("hello");
sb.delete(0,5);
sb.toString();

它打印"Hello"

如果您阅读了留档,您会看到结束是非包容性的,这意味着它将从start删除到end-1,因此没有IndexOutOfBound。

但是,请尝试以下方法:

StringBuilder builder = new StringBuilder();

builder.append("hello");
builder.delete(0,7);

你很可能会得到一个索引出界。

编辑:个人抱怨-这是一个很好的平衡,既可以通过抛出异常来阻止某人射中自己的脚,也可以让他们这样做,但实际上在这种情况下什么也不做。

“你真的不能这样做,而且会得到一个异常”的一个例子是,例如在一些重要的事情上调用init()两次,这些重要的事情应该只初始化一次。

“您不应该这样做,但如果您这样做,我不会使您的程序崩溃”的一个例子是,例如,在记录器上调用init()两次。

在这种情况下,试图删除越界的字符属于第一类。所以“这是你的虫子,不是我的”之类的话。

但是删除一个范围——就个人而言——甚至不应该抛出异常。如果范围大于字符串的长度,我的工作就是删除所有内容(在您指定的范围内),而您的bug就是找出为什么删除的内容比您的多。

这正是证明为什么写留档很重要的事情。

如果你这样做了:

String builder sb = new StringBuilder();
sb.append("hello").append("Jello");
sb.delete(0,6); //e.g. you somehow thought that hello is of length 6
sb.toString();

得到一个Jello,这是你的事情,找出原因。你的虫子。不是我的。如果你做了sb.delete(0,7);并得到一个ello,那你就去弄清楚为什么。你的虫子,不是我的。文档很清楚会发生什么。

但这取决于“东西”是什么。如果这很重要,不,你会得到一个例外。如果是愚蠢的事情,当然,去吧,朝自己的脚开枪,无害。

但是,在这种特殊情况下,我甚至允许此代码正常工作:

String builder sb = new StringBuilder();
sb.append("hello").append("hello");
sb.delete(0,200);
sb.toString();

并且不会抛出异常。但是在内部,我只做delete(0,10)

TL;博士-它不是前后矛盾的,它的工作原理和它说的完全一样。

 类似资料:
  • 问题内容: 当您必须遍历一个集合并用分隔符分隔每个数据的字符串时,总是总是在末尾有一个额外的分隔符,例如 给出类似以下内容: serverId_1,serverId_2,serverId_3, 我想删除StringBuilder中的最后一个字符(不进行转换,因为在此循环之后我仍然需要它)。 问题答案: 其他人指出了该方法,但这是另一种替代方法: 或者,使用Guava中的类:) 从Java 8开始,

  • 我的问题是,我在尝试删除不一致的邮件时收到错误。 我收到这个错误: 我还尝试了,但我收到一个错误,告诉我消息未定义。 当我删除试图删除消息的代码时,程序就会工作。

  • 是否有任何方法可以删除除bot本身之外的任何人发送的消息,文档似乎表明这是可能的 您自己的邮件可以删除没有任何适当的权限。然而,要删除其他人的邮件,您需要适当的权限才能这样做。 但是我找不到一种方法来定位消息,以便在on_message事件触发器中这样做,我是错过了什么还是不可能?

  • 我使用Python3.6idle编写了一个bot,我想添加一个命令,但我不知道如何添加它。你们中的一些人能帮我举一些例子或建议吗?我会很高兴的,谢谢。

  • 我正在为我的discord服务器制作一个机器人,但我遇到了问题。我想要的是,当最后一个人离开一个语音频道(它是由机器人生成的)时,我想要删除该语音频道。 我也考虑过测试任何空的语音频道并删除它们,但我不知道如何做。

  • 最近,我开始研究一个不和谐的机器人,并添加了斜杠命令。 这是我的interactionHandler.js 有没有办法删除命令,因为我找不到方法。我想得到命令的ID,但是我不知道怎么做。感谢所有的帮助者:)Discord.js v13