Java数组赋值后在其他方法中值变为0的问题咨询
问题分析与解决方案
嘿,我一眼就看出问题啦!这是Java新手很容易踩的**变量遮蔽(Variable Shadowing)**坑,咱们来一步步解决~
问题根源
你在类里声明了6个成员变量(pVectorCoinOne到pVectorCoinSix),但在setPositionVectors()方法里,你又重新写了int[] pVectorCoinOne = {...}这样的代码——这相当于在方法内部创建了和成员变量同名的局部变量!
你给这些局部变量赋值的操作,完全不会影响到类的成员变量。方法执行结束后,局部变量就被销毁了,而类的成员变量还是保持初始化时的默认值(int数组的每个元素默认是0),所以打印出来全是0。
修复后的代码
只需要去掉方法里每个变量前的int[],直接给类的成员变量赋值就行:
import java.util.Arrays; import javax.swing.JLabel; public class YourClassName { // 记得替换成你的类名 public int[] pVectorCoinOne = new int[2]; public int[] pVectorCoinTwo = new int[2]; public int[] pVectorCoinThree = new int[2]; public int[] pVectorCoinFour = new int[2]; public int[] pVectorCoinFive = new int[2]; public int[] pVectorCoinSix = new int[2]; // 假设这些JLabel已经在类里定义过 private JLabel lblCoinImage1; private JLabel lblCoinImage2; private JLabel lblCoinImage3; private JLabel lblCoinImage4; private JLabel lblCoinImage5; private JLabel lblCoinImage6; public void setPositionVectors(){ // 去掉前面的int[],直接引用类的成员变量赋值 pVectorCoinOne = new int[]{lblCoinImage1.getX(), lblCoinImage1.getY()}; pVectorCoinTwo = new int[]{lblCoinImage2.getX(), lblCoinImage2.getY()}; pVectorCoinThree = new int[]{lblCoinImage3.getX(), lblCoinImage3.getY()}; pVectorCoinFour = new int[]{lblCoinImage4.getX(), lblCoinImage4.getY()}; pVectorCoinFive = new int[]{lblCoinImage5.getX(), lblCoinImage5.getY()}; pVectorCoinSix = new int[]{lblCoinImage6.getX(), lblCoinImage6.getY()}; } public void printAllToOutput(){ setPositionVectors(); System.out.println(Arrays.toString(pVectorCoinOne)); System.out.println(Arrays.toString(pVectorCoinTwo)); System.out.println(Arrays.toString(pVectorCoinThree)); System.out.println(Arrays.toString(pVectorCoinFour)); System.out.println(Arrays.toString(pVectorCoinFive)); System.out.println(Arrays.toString(pVectorCoinSix)); } }
优化建议(可选)
如果这些变量功能类似,用二维数组或者列表来管理会更简洁,避免重复写大量相似代码:
import java.util.Arrays; import javax.swing.JLabel; public class YourClassName { // 用二维数组存储所有硬币的坐标 public int[][] pVectorCoins = new int[6][2]; // 把所有硬币标签放到一个数组里,方便循环处理 private JLabel[] coinImages; // 初始化时把标签存入数组 public YourClassName() { coinImages = new JLabel[]{lblCoinImage1, lblCoinImage2, lblCoinImage3, lblCoinImage4, lblCoinImage5, lblCoinImage6}; } public void setPositionVectors(){ for(int i = 0; i < pVectorCoins.length; i++){ pVectorCoins[i] = new int[]{coinImages[i].getX(), coinImages[i].getY()}; } } public void printAllToOutput(){ setPositionVectors(); for(int[] vector : pVectorCoins){ System.out.println(Arrays.toString(vector)); } } }
这样以后要增加更多硬币,只需要在数组里添加元素就行,不用重复声明变量,代码维护起来更轻松~
内容的提问来源于stack exchange,提问作者Nick C
相关产品推荐
相关产品推荐

