Java字符串溢出时会发生什么?

时间:2020-03-19 11:02:13

标签: java arrays string char overflow

据我了解,Java Strings只是一个字符数组,最大长度是一个整数值。 如果我正确理解this answer,可能会导致字符串溢出-尽管在“ 异常情况”中。

由于Java字符串基于char数组,并且Java自动检查数组范围,因此仅在特殊情况下才可能发生缓冲区溢出:

  1. 如果您通过JNI调用本机代码
  2. 在JVM本身(通常用C ++编写)中
  3. 解释器或JIT编译器无法正常工作(Java字节码强制性边界检查)

如果我错了,请更正我,但是我相信这意味着您可以在数组的边界外进行写操作,而无需触发ArrayIndexOutOfBounds(或类似的)异常。 >

我在C ++中遇到了缓冲区溢出的问题,我可以找到许多有关other languages的建议,但是没有一个具体的答案可以回答如果您导致String(或任何其他数组类型)导致缓冲区溢出的情况)。

我知道Java字符串是经过边界检查的,不能仅由本机Java代码溢出(除非根据上面的第2点和第3点,除非编译器或JVM中存在问题),但是第一点意味着从技术上来说可以将char []置于...不良的位置。

鉴于此,假设以上内容正确,我对Java中此类问题的行为有两个具体问题:

  1. 如果一个字符串可能溢出,当它溢出时会发生什么?
  2. 这种行为的含义是什么?

谢谢。

2 个答案:

答案 0 :(得分:3)

要回答您的第一个问题,我很幸运能真正导致此类错误,而执行只是停止抛出以下错误之一:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

这就是我的情况,我不知道这是否代表安全问题,因为C和C ++中的缓冲区溢出。

答案 1 :(得分:0)

Java中的String是不可变的,因此一旦创建,就不会写入charbyte的基础数组(取决于Java版本和String的内容,是否是另一个)。好的,使用JNI可以避免这种情况,但是使用纯Java,就不可能在不引起ArrayOutOfBoundsException之类的情况下离开数组的边界。

在String处理的上下文中引起某种溢出的唯一方法是创建一个太长的新String。确保您的JVM有足够的堆(大约36 GB),创建一个char的{​​{1}}数组,适当地填充,使用该数组调用Integer.MAX_VALUE - 1,然后执行

new String( byte [] )

但是结果只是一个异常,告诉您它试图创建一个太大的数组。