java - 为什么不使用字符串的长度作为开始索引调用子字符串抛出 OutOfBoundsException?
问题描述
在测试一些代码时,我注意到如果我使用的索引等于字符串的长度,则 substring 方法不会抛出异常。例如:
String s = "holy";
System.out.println(s.substring(4));
输出不会返回任何内容,但不会引发异常。但如果我试图打电话:
String s = "holy";
System.out.println(s.substring(5));
它会抛出一个 IndexOutOfBoundsException。我阅读了该方法的Javadoc,它说
如果 beginIndex 为负数或大于此 String 对象的长度。
任何人都知道为什么它允许开始索引等于字符串长度?
解决方案
想想其他的调用substring
:
"holy".substring(n)
可以可视化为复制n
(包括)和字符串结尾(不包括)之间的字符范围。
例如:
"holy".substring(0)`
h o l y
O-------X (O = start, X = end)
0 1 2 3 4
即开始位置正好在字符之前,结束位置正好在字符之后。在这种情况下,字符串的结果长度为end - start
, 4。
和
"holy".substring(1)
h o l y
O-----X // length = 4 - 1 = 3.
0 1 2 3 4
等等然后:
"holy".substring(4)
可以可视化为
h o l y
O // O and X are at the same position
X // length = 4 - 4 = 0
0 1 2 3 4
O 和 X 在同一个位置很好:它只是意味着结果是一个零长度的字符串,""
.
但是,将索引增加到 5:
"holy".substring(5)
h o l y
X-O // O is after X
// length = 4 - 5 = -1 (?!)
0 1 2 3 4 5
长度为 -1 的字符串没有意义,因此例外。
推荐阅读
- java - 为什么从 int 到 char 的隐式类型转换没有给我错误?
- tableau-api - 如何使用 Tableau 中的计算字段复制运行总表计算?
- c - 使用 realloc 函数时出现内存损坏
- azure - 验证与阶段部署的连接 - Azure
- python - 无法在 PyCharm 中导入 pygame
- node.js - passport.use jwt pass role parameter
- python - PyTorch:计算对称矩阵的顶部特征向量
- php - 我的 API 验证消息在 Laravel 7.x 中不起作用
- django - 如何在具有以下条件的模板中获取用户名,请告诉我?
- mysql - 如何在 LARAVEL herf 路由名称中插入数据库值