【问题标题】:Array index out of bound exception java数组索引越界异常java
【发布时间】:2016-01-04 03:55:43
【问题描述】:

以下代码抛出数组索引超出范围异常。我已经初始化了 1000 的大小,但还没有完全利用。未使用索引的具体值是多少?

byte[] buffer=new byte[1000];
     String s="i am a stupid";
     buffer=s.getBytes();

     System.out.println(buffer[30]);

【问题讨论】:

    标签: java arrays exception


    【解决方案1】:

    当您调用String#getBytes方法时,您会得到一个新数组,其长度等于表示字符串所需的字节数。由于Java docs

    使用给定的字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。

    在您的情况下,它的长度等于字符串的长度(13 个字节),无论如何它都小于 30。这就是您在尝试获取第 30 个元素时遇到此异常的原因。

    如果你需要用你从字符串变成的数组来初始化你的缓冲区变量,你需要使用System#arraycopy方法:

    byte[] byteAr = s.getBytes();
    System.arraycopy(byteAr, 0, buffer, 0, byteAr.length);
    

    如果您想知道默认情况下用于初始化数组的值是什么,那么它是您的数组所包含的数据类型的默认值。如果是字节,则默认值为 0。

    【讨论】:

      【解决方案2】:

      因为buffer=s.getBytes(); 不使用你刚刚分配的数组。它使 buffer 引用了一个全新的数组,在您的示例中该数组不会有 30 个成员。

      【讨论】:

        【解决方案3】:

        当您重新分配引用时,您分配的 buffer 不再可访问。我想你想使用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 喜欢

        byte[] buffer=new byte[1000];
        String s="i am a stupid";
        byte[] bytes=s.getBytes();
        System.arraycopy(bytes, 0, buffer, 0, bytes.length);
        

        请注意,buffer[30] 的默认值为 0

        【讨论】:

        • 这会将我的缓冲区大小调整为字节数组中字符串的大小吗?
        • @VishalS 不,你的缓冲区大小将是 1000,只有第一个元素将从字符串初始化
        • 我正在检查缓冲区的大小以打破我的代码中的 while 循环(如果不是 1000,我想打破)。从这个意义上说,我可以检查上面提到的字节和缓冲区的长度。 B'coz如果他们不相等,我想爆发。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        相关资源
        最近更新 更多