Java中通过System.arraycopy按引用返回byte[]的异常排查
问题解答
1. 能否通过System.arraycopy实现类似“引用返回”的效果?
可以,但得先搞清楚Java的参数传递机制:Java是值传递,数组作为参数传递时,传的是数组引用的副本。不过这个副本和原引用指向同一个数组对象,所以你可以通过System.arraycopy修改这个共享数组的内容,调用方就能拿到修改后的结果——本质是修改数组对象的内容,而非改变引用本身。
2. 为什么会触发ArrayIndexOutOfBoundsException?
直接原因就是传入的outputData数组长度不够1280:
- 你的代码里
upperBytes固定是1280长度,执行System.arraycopy(upperBytes, 0, outputData, 0, upperBytes.length)时,要求outputData的长度必须≥1280,不然从索引0开始复制1280个元素,肯定会超出outputData的边界。 - 另外如果
outputData是null,这里还会抛出空指针异常。
修复建议
- 最直接的:调用这个方法时,必须传入一个长度≥1280的
byte[]对象,比如:byte[] output = new byte[1280]; int result = exampleFunction(input, inputSize, output); - 或者在方法内部加前置检查,避免静默报错:
if (outputData == null || outputData.length < upperBytes.length) { throw new IllegalArgumentException("outputData必须至少为1280字节长度"); } System.arraycopy(upperBytes, 0, outputData, 0, upperBytes.length);
内容的提问来源于stack exchange,提问作者mAyA
相关产品推荐
相关产品推荐

