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
相关产品推荐
相关产品推荐

