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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:12:56