【问题标题】:Getting ArrayOutofBoundsException in my for Loop在我的 for 循环中获取 ArrayOutofBoundsException
【发布时间】:2026-01-09 20:50:01
【问题描述】:
public class WeightOnPlanetsV1
{
  public static double[] calcWeight(double[] gravity, double[]mass)
  {
    double[] weight = new double[gravity.length];

    for (int i = 0; i < gravity.length; i++) {
        weight[i] = (mass[i] * 1000) / gravity[i];
        weight[i] = weight[i] / 433.59237;
    }

    return weight;
  }

  public static double[] takeFromFile(double[] gravity)throws IOException
  {
    File fileName = new File("GravityResults.txt");
    Scanner inFile = new Scanner(fileName);

    for (int i = 0; i < gravity.length; i++) {
        gravity[i] = inFile.nextDouble();
        gravity[i] = gravity[i] / 10;
    }
    inFile.close();

    return gravity;
  }

  public static void printResults(String[] names, double[] gravity, double weight[])
  {
    System.out.printf("%37s \n","My Weight on the Planets");
    System.out.printf("%5s %20s %15s \n","Planet","Gravity","Weight(lbs)");
    System.out.println("---------------------------------------");
    for (int i = 0; i < names.length; i++) {
        System.out.printf("%5s %10f %15f \n",names[i], gravity[i], weight[i]);
    }
  }

  public static void main(String[] args)throws IOException
  {        
    String[] names = {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"};
    double[] weightOnPlanets = {100, 100, 100, 100, 100, 100, 100, 100, 100};
    double[] gravity = {};
    double[] masses = {3.3022 * Math.pow(10,23), 4.8685 * Math.pow(10,24), 5.9736 * Math.pow(10,24), 6.4185 * Math.pow(10,23), 1.8986 * Math.pow(10,27), 5.6846 * Math.pow(10,26), 8.6810 * Math.pow(10,25), 1.0243 * Math.pow(10,26), 1.312 * Math.pow(10,22)};

    double[] gravities = takeFromFile(gravity);
    double[] finalWeights = calcWeight(gravities,masses);

    printResults(names, gravities, finalWeights);
  }  
}

我的错误来自于

for (int i = 0; i < names.length; i++) {
    System.out.printf("%5s %10f %15f \n",names[i], gravity[i], weight[i]);
}

当我尝试打印结果时。它给了我

java.lang.ArrayIndexOutOfBoundsException: 1
    at WeightOnPlanetsV1.printResults(WeightOnPlanetsV1.java:45)
    at WeightOnPlanetsV1.main(WeightOnPlanetsV1.java:63)

作为错误

【问题讨论】:

  • 当您收到此异常时,您是否尝试将异常打印到 Eclipse 的控制台?

标签: java arrays loops for-loop


【解决方案1】:

您检查names 数组的边界并访问gravityweight,假设它们的长度与names 相同或更大

【讨论】:

  • 是的,我知道这可能是个问题。感谢您的问题。
【解决方案2】:

基本上,您初始化: double[] gravity = {}; 在你的主函数中。

然后你调用:double[] gravities = takeFromFile(gravity); 因为 gravity 没有元素,并且因为在你的 takeFromFile(double[]) 函数中你有这个:

 for (int i = 0; i < gravity.length; i++) {
    gravity[i] = inFile.nextDouble();
    gravity[i] = gravity[i] / 10;
}

基本上读取文件 gravity.lenght 次(顺便说一句,这是一个非常糟糕的主意。如果文件的数字少于 gravity 的长度,则会出现另一个错误[])

无论如何,正如前面有人所说,这一切都会导致重力和重力都为空,finalWeights[] 也是如此,因为您使用以下方法对其进行了初始化:

double[] finalWeights = calcWeight(gravities,masses);

并且由于 gravities 有 0 个元素...好吧,这确实发生了。 现在,names[] 有 9 个元素,大于 0,所以在:

System.out.printf("%5s %10f %15f \n",names[i],gravity[i], weight[i]);

你得到一个 ArrayOutOfBounds 异常(因为你没有检查 gravity[]weight[] 大小,结果都是 0)。这意味着您需要确保使用比 names[]

更大的 lenght 来初始化 gravity[]

我个人会重写该代码。使用 massgravityname 属性以及函数 calcWeight()calcWeight(double mass) 在与您的功能相同的对象内。然后,您可以在 main 函数中创建一个 Planet[] 数组,并在 takeFromFile(Planet[] planets) 中使用它,通过文件初始化所有 行星 数组,而不仅仅是权重。但这只是我的偏好。

【讨论】:

    【解决方案3】:

    您的问题始于takeFromFile,它接收一个空数组(double[] gravity = {};)并返回一个空数组。

    稍后,遍历gravity(或gravities)数组的所有循环什么都不做,而从0 到names.length - 1(在printResults)的循环会导致ArrayIndexOutOfBoundsException,因为它假设 namesgravity 数组的长度相同。

    【讨论】:

      【解决方案4】:

      double[] gravity = {}; 是一个空数组,所以你必须像其他数组一样填充它

      【讨论】:

        【解决方案5】:

        修改您的代码以使用对象和列表。它变得更加清晰:

        class Planet {
            String name;
            double weightOnPlanet;
            double gravity;
            double mass;
            public Planet(...) { ... } // Constructor.
        }
        
        public static void main(String[] args) throws IOException {
            List<Planet> planets = new ArrayList<>();
            planets.add(new Planet(...));
            ...
        }
        

        【讨论】: