【发布时间】: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]);
【问题讨论】:
以下代码抛出数组索引超出范围异常。我已经初始化了 1000 的大小,但还没有完全利用。未使用索引的具体值是多少?
byte[] buffer=new byte[1000];
String s="i am a stupid";
buffer=s.getBytes();
System.out.println(buffer[30]);
【问题讨论】:
当您调用String#getBytes方法时,您会得到一个新数组,其长度等于表示字符串所需的字节数。由于Java docs:
使用给定的字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。
在您的情况下,它的长度等于字符串的长度(13 个字节),无论如何它都小于 30。这就是您在尝试获取第 30 个元素时遇到此异常的原因。
如果你需要用你从字符串变成的数组来初始化你的缓冲区变量,你需要使用System#arraycopy方法:
byte[] byteAr = s.getBytes();
System.arraycopy(byteAr, 0, buffer, 0, byteAr.length);
如果您想知道默认情况下用于初始化数组的值是什么,那么它是您的数组所包含的数据类型的默认值。如果是字节,则默认值为 0。
【讨论】:
因为buffer=s.getBytes(); 不使用你刚刚分配的数组。它使 buffer 引用了一个全新的数组,在您的示例中该数组不会有 30 个成员。
【讨论】:
当您重新分配引用时,您分配的 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。
【讨论】: