【问题标题】:Java Substring: Why is this going out of bounds sometimes?Java Substring:为什么有时会超出范围?
【发布时间】:2018-11-27 15:56:48
【问题描述】:
String inputOrig = event.getMessage();
inputHist += inputOrig;
inputHist = inputHist.substring(Math.max(0, inputHist.length()-256));

底线偶尔会导致带有负索引的 IndexOutOfBounds 异常,但我认为这是不可能的,因为我取的是表达式和​​零中的较大者。它应该默认为零,不是吗?

编辑:这是个例外

Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
    at java.lang.String.substring(Unknown Source) ~[?:1.8.0_171]

还有一个和它一样,索引为-20,下一行只是指向这段代码所在的方法。

我正在尝试使用 inputHist 作为 event.getMessage() 的历史记录,上限为 256 个字符,我认为这很有效。这或至少以前在我的代码中工作过的类似的东西,但我不确定我是否不小心更改了某些东西,如果我这样做了,我不知道它是什么。

【问题讨论】:

  • 你能告诉我们异常信息吗?
  • 根据你的描述,你想要的代码大概是inputHist.substring(0, Math.min(inputHist.length(), 256))。但目前尚不清楚为什么会出现负索引错误。
  • 什么输入字符串导致错误?在运行 substring() 函数之前检查调试器中的值。
  • 我唯一的想法是这可能与并发和竞争条件有关。
  • 使用Math.max(0, xxx),您永远无法获得-2,因此错误不能来自行代码。

标签: java string substring indexoutofboundsexception


【解决方案1】:

所以我说那条线应该工作是正确的。问题在于我在设法完全错过的方法中使用的另一个子字符串。稍后在该方法中,如果 inputOrig 满足某些条件,我将从历史记录中删除它,以防止出现反馈循环。

inputHist = inputHist.substring(0,inputHist.length()-inputOrig.length());

我还不完全确定如何解决它,但那将是一个完全不同的问题。我会继续寻找,如果我不能解决它,稍后再问。谢谢大家的帮助和容忍我的错误。

【讨论】:

  • 请随意删除此问题,因为它描述的问题实际上并不存在(至少与您显示的代码无关)。虽然你会因为这个问题而失去声誉,但在 IMO 看来这仍然是正确的行动。
【解决方案2】:

当您的 inputOrigin 的长度为 0 时,可能会导致索引超出范围,因为索引从 0 开始,那么字符串的最后一个字符就是它的长度 -1 我认为您应该将 -1 添加到您的上限并再次检查不同的条件

【讨论】:

  • event.getMessage() 无法返回零,因为不会触发此代码所在的方法。
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 2020-09-04
  • 1970-01-01
  • 2022-08-10
  • 2014-03-30
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多