StringBuilder 构造函数实现容易出现异常
StringBuilder constructor implementation vulnerable to exception
使用现有 String 或 CharSequence 初始化时 StringBuilder
的初始容量是 StringBuilder
构造函数中代码中原始 text + 16
的长度:
super(str.length() + 16);
我的查询如果原始长度接近Integer.MAX_VALUE
怎么办?
它会抛出 NegativeArraySizeException
还是会更改为 long 以正确执行?
它会抛出一个 NegativeArraySizeException
因为整数会回绕。
实际上,它等同于:
int len = Integer.MAX_VALUE;
// here we are trying to create an array of size -2147483633
char [] value = new char[len + 16];
它会抛出 NegativeArraySizeException
此处的 NegativeArraySizeException
应为:
- 根据
String
实现,String
在内部使用 char[]
来保存单个字符。所以最大字符串长度实际上取决于 char[]
大小。
- Java 在内部使用
int (not Integer)
来索引数组的各个位置,因此 String
的最大长度可以是 Integer.MAX_VALUE
以及任何大于它的东西应该抛出异常,因为 JVM
将无法索引超过最大 int
值的各个位置。
由于这个约束,任何超出最大允许限制的数组都会抛出 NegativeArraySizeException
,在这种情况下是最大 int 值。
使用现有 String 或 CharSequence 初始化时 StringBuilder
的初始容量是 StringBuilder
构造函数中代码中原始 text + 16
的长度:
super(str.length() + 16);
我的查询如果原始长度接近Integer.MAX_VALUE
怎么办?
它会抛出 NegativeArraySizeException
还是会更改为 long 以正确执行?
它会抛出一个 NegativeArraySizeException
因为整数会回绕。
实际上,它等同于:
int len = Integer.MAX_VALUE;
// here we are trying to create an array of size -2147483633
char [] value = new char[len + 16];
它会抛出 NegativeArraySizeException
此处的 NegativeArraySizeException
应为:
- 根据
String
实现,String
在内部使用char[]
来保存单个字符。所以最大字符串长度实际上取决于char[]
大小。 - Java 在内部使用
int (not Integer)
来索引数组的各个位置,因此String
的最大长度可以是Integer.MAX_VALUE
以及任何大于它的东西应该抛出异常,因为JVM
将无法索引超过最大int
值的各个位置。
由于这个约束,任何超出最大允许限制的数组都会抛出 NegativeArraySizeException
,在这种情况下是最大 int 值。