You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java访问Planet[i].moon抛出NullPointerException问题排查与修复

问题分析与修复方案

错误原因

代码抛出NullPointerException的核心问题是循环内部非法修改了循环变量i:
在这一行代码中:

planets[i].moon.col = colArray[i++];

i++会让循环变量i直接自增,导致后续代码(比如planets[i].moon.centreOfRotationDistance = ...)访问的planets[i]是下一个索引的元素,但此时这个元素还没有被new Planet()初始化(初始化操作只在循环开头执行了当前i对应的元素),所以planets[i]为null,访问它的moon属性自然会触发空指针异常。

同时,这个内部的i++还会导致循环提前结束:原本循环要执行8次(i < 8),每次循环i自增1,但内部的i++会让i额外增加1,实际循环只会执行4次就结束,还存在索引越界的风险。

修复方法

只需要将内部的i++改为i(如果想让卫星使用当前行星对应的颜色),或者改为i+1(如果想使用下一个颜色,注意i+1最大为8,colArray刚好有第9个元素,不会越界),确保循环变量i只由循环本身控制。

修复后的代码(卫星使用当前行星颜色)

System.out.println("Creating planets...");
String[] colArray = {"red", "orange", "yellow", "green", "blue", "indigo", "violet", "white", "red"};
for(int i = 0; i < 8; i++){
    planets[i] = new Planet();
    planets[i].distance = 100 + (i * 100);
    planets[i].angle = 0 + (i * 20);
    planets[i].diameter = 20 + (i * 10);
    planets[i].col = colArray[i];
    System.out.println("Planet " + i + " created");
    System.out.println("Creating moon..." + i);
    planets[i].moon.distance = 10 + (i * 5);
    planets[i].moon.angle = 0 + (i * 20);
    planets[i].moon.diameter = i + 2;
    planets[i].moon.col = colArray[i];
    planets[i].moon.centreOfRotationDistance = (100 + (i * 100))/10;
    planets[i].moon.centreOfRotationAngle = 0 - (i * 20);
}
System.out.println("Done creating planets.");
System.out.println("Creating the sun...");

若卫星需使用下一个颜色的修改方式

如果你的本意是让卫星使用下一个颜色,可修改为:

planets[i].moon.col = colArray[i+1];

内容的提问来源于stack exchange,提问作者suk1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:50:23