java - 为什么方法 add() 不会增加数组的大小?
问题描述
我正在编写一个手动程序,它将动态增加数组大小。但它总是通过越界异常。我不知道为什么。任何帮助表示赞赏!
public class variable_arrays_no_list_use {
public static void main(String[] args) {
int size = 2;
int []arr = new int[size];
arr = add(arr, 5);
arr = add(arr, 6);
arr = add(arr, 7);
}
public static int lastindex = -1; //last index variable
public static int [] add(int []array,int value)
{
if (array.length == lastindex+1) {
int []tempa = new int[lastindex*2];
for (int i = 0; i < array.length; i++) {
tempa[i] = array[i];
}
array = tempa;
}
array[++lastindex] = value;
return array;
}}
错误信息:
线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:在 variable_arrays_no_list_use.main(variable_arrays_no_list_use.java:8) 的 variable_arrays_no_list_use.add(variable_arrays_no_list_use.java:28) 处的索引 2 超出了长度 2 的范围
解决方案
问题出在这部分:
if (array.length == lastindex+1) {
int []tempa = new int[lastindex*2];
在这里,当您添加第三个元素时,lastindex
其值为 1,array.length
为 2,而在 if 中,条件为真,因为2 == 1+1
. 但是,为了计算新数组的新大小,您取 的值lastindex
,它仍然是 1,因此新数组再次获得大小 2。您想要做的事情如下:
if (array.length == lastindex+1) {
int []tempa = new int[(lastindex+1)*2];
推荐阅读
- java - 无法将来自 firebase 实时数据库的消息显示到 recyclerview
- python - 如何在没有图形用户界面和数据库模型的情况下使用 abaqus cae?
- c# - 如何阻止将文档上传到已存在的 SharePoint?- CRM在线集成
- c# - 使用独立线程在 Windows 窗体中启动、暂停和继续嵌入式 HALCON 应用程序时出现问题
- templates - 导入包含同名模板的 XSLT 脚本
- python - Python - 拆分包含字符的列表元素(例如/,[])并创建新元素
- xslt - PDF 阅读器双页视图中的 XSL FO 封面
- ruby-on-rails - RSpec 帮助器规范失败但在浏览器中有效
- javascript - 当我更新用户对象的一个值时,数据库中的所有其他值都将被删除。我能做些什么呢?
- reactjs - Chain redux 商店更新