Java:数组中存在索引,ArrayIndexOutOfBoundsException:0
很抱歉,如果这是由于我遗漏了一些明显的东西而得到的答案,但我已经在谷歌上搜索了好几天,它似乎没有任何意义。我有3年的Javascript经验,现在正在学习Java,所以我对任何东西的基本概念都不落后 我使用IntelliJ来解决这个问题,但它没有指出问题所在。我的类之间的通信(访问权限和实例化)很好,代码语法和变量类型也很好,等等,所以我真的不知道它是什么 我有一个数据类,它只保存“只读”数据供其他类使用Java:数组中存在索引,ArrayIndexOutOfBoundsException:0,java,windows,arrays,indexing,Java,Windows,Arrays,Indexing,很抱歉,如果这是由于我遗漏了一些明显的东西而得到的答案,但我已经在谷歌上搜索了好几天,它似乎没有任何意义。我有3年的Javascript经验,现在正在学习Java,所以我对任何东西的基本概念都不落后 我使用IntelliJ来解决这个问题,但它没有指出问题所在。我的类之间的通信(访问权限和实例化)很好,代码语法和变量类型也很好,等等,所以我真的不知道它是什么 我有一个数据类,它只保存“只读”数据供其他类使用 public class Data { // snip public st
public class Data {
// snip
public static int[][] specs = {
{6,1,6,40},
{5,2,5,30},
{5,3,4,40},
{4,4,3,60}
};
}
还有一个类在初始化时必须读取这些数据
public class Soldier {
// snip
public int range;
public Soldier() {
int x = ...; // user input
range = Data.specs[x][1];
}
}
specs数组本身包含定义的数据(即数组不是空的),x作为specs数组的索引有效(即0x应大于-1且小于4) stacktrace没有提到焊料类,它在陆军类的constructor中 无论如何,仅仅知道索引应该在一个范围内是不够的。作为程序员,在尝试访问该索引处的元素之前,您有责任验证索引
if(index > 0 && index < array.length) {
//then only acess the element at index
if(索引>0&&index
问题是数组的大小为0。这一行
int x=…;//用户输入
意味着您正在以某种方式从用户获取输入并使用它访问数组。您是否检查此值以查看其是否在范围内(即,在0和3之间)?如果不是,这可能就是您的测试工作的原因
编辑:像这样的问题可能会为您解决:
public class Army {
public Team team;
public Vector<Soldier> soldiers;
public Army(Team p) {
soldiers = new Vector<Soldier>()
team = p;
for (int i = 0;i < team.game.settings.xsoldiers;i++) {
soldiers.add(new Soldier(this));
}
}
}
公共级军队{
公共团队;
公共媒介兵;
公军(p队){
士兵=新向量()
团队=p;
对于(inti=0;i
从你的其他代码判断,这种模式在你的
游戏
对象中也很有用。问题在于你的陆军
类:
public static Object[] soldiers = new Object[] {};
初始化名为士兵的空(长度==0)数组,但稍后访问:
soldiers[soldiers.length] = new Soldier(this);
这导致了失败
根据定义,士兵。长度超出了数组的界限(因为界限是从0
到士兵。长度-1
)
要克服这个问题,请确保在数组中分配足够的空间,或者改用动态数组()。您可以使用将元素附加到ArrayList
,在填充它之前,您不需要知道预期的大小。对于x
的值,它失败了吗?我们可以准确地看到错误消息吗(可能还有行号的指示)请提供一个完整的堆栈跟踪。Java数组是零基的。根据堆栈跟踪,错误不是来自类数据或士兵,而是从陆军类的第13行开始。可能是您使用了“范围”中的值其他地方作为导致错误的索引。发布一些来自陆军类的代码。x作为规范数组的索引是有效的(即0我认为OP知道这一点(即,他将其包含在他的帖子中)。是的,它由单独的函数检查有效性,该函数要求输入,并要求将相应的数组作为参数传递给它,以便它可以当场检查它是否为x作为specs数组的索引是有效的(实际上是0,尽管我使用的是Arraylist而不是Vector(我以前遇到过Arraylist,这是这里的第一个建议)。不过,我肯定会查找更多的变量类型,谢谢!很可能就是这样……我会查找如何使用ArrayList,然后让您知道。@user1744034使用ArrayList
非常简单,只需使用ArrayList士兵=new ArrayList()
并使用士兵将元素附加到其末尾。添加(新士兵(此));
是的,成功了,谢谢!仍在尝试了解Java中所有不同类型的变量,以及在哪种情况下最好使用哪种类型的变量(即它们支持哪些方法等等)。。。
public static Object[] soldiers = new Object[] {};
soldiers[soldiers.length] = new Soldier(this);