Java:数组中存在索引,ArrayIndexOutOfBoundsException:0

Java:数组中存在索引,ArrayIndexOutOfBoundsException:0,java,windows,arrays,indexing,Java,Windows,Arrays,Indexing,很抱歉,如果这是由于我遗漏了一些明显的东西而得到的答案,但我已经在谷歌上搜索了好几天,它似乎没有任何意义。我有3年的Javascript经验,现在正在学习Java,所以我对任何东西的基本概念都不落后 我使用IntelliJ来解决这个问题,但它没有指出问题所在。我的类之间的通信(访问权限和实例化)很好,代码语法和变量类型也很好,等等,所以我真的不知道它是什么 我有一个数据类,它只保存“只读”数据供其他类使用 public class Data { // snip public st

很抱歉,如果这是由于我遗漏了一些明显的东西而得到的答案,但我已经在谷歌上搜索了好几天,它似乎没有任何意义。我有3年的Javascript经验,现在正在学习Java,所以我对任何东西的基本概念都不落后

我使用IntelliJ来解决这个问题,但它没有指出问题所在。我的类之间的通信(访问权限和实例化)很好,代码语法和变量类型也很好,等等,所以我真的不知道它是什么

我有一个数据类,它只保存“只读”数据供其他类使用

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);