【问题标题】:Android Studio ImageView Array NullPointerExceptionAndroid Studio ImageView 数组 NullPointerException
【发布时间】:2019-11-02 21:56:50
【问题描述】:

我正在开发一个骰子模拟器(我的第二个项目用于解决所有问题)。我在一个数组中有五个骰子图像和变量,我想循环访问它们。 Android Studio 在 Switch 案例的不同点给了我一个 NullPointerException,我不知道为什么。 这是我的变量和包含方法的数组:

private ImageView imageViewDiceOne;
private ImageView imageViewDiceTwo;
private ImageView imageViewDiceThree;
private ImageView imageViewDiceFour;
private ImageView imageViewDiceFive;
private ImageView[] imageViewDice = new ImageView[]{imageViewDiceOne, imageViewDiceTwo,
        imageViewDiceThree, imageViewDiceFour, imageViewDiceFive};
private Button mButtonThrow;
private int diceValue;

private int rollDice() {
    this.diceValue = (int) (Math.random() * 6) + 1;

    return this.diceValue;
}

private void setImageViewDice(){
    for(int i = 0; i < imageViewDice.length; i++) {

        switch (rollDice()) {
            case 1:
                imageViewDice[i].setImageResource(R.drawable.dice1);
                break;
            case 2:
                imageViewDice[i].setImageResource(R.drawable.dice2);
                break;
            case 3:
                imageViewDice[i].setImageResource(R.drawable.dice3);
                break;
            case 4:
                imageViewDice[i].setImageResource(R.drawable.dice4);
                break;
            case 5:
                imageViewDice[i].setImageResource(R.drawable.dice5);
                break;
            case 6:
                imageViewDice[i].setImageResource(R.drawable.dice6);
                break;
        }
    }
}

这是我的 OnClickListener:

    mButtonThrow = findViewById(R.id.button_throw);
    mButtonThrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View viewFiveDice) {
                setImageViewDice();
        }
    });

这是我的例外(第 45 行是 Switch 的案例 5,但每次尝试都会改变,第 68 行是我的 OnClickListener):

    java.lang.NullPointerException: Attempt to invoke virtual method 'void 
    android.widget.ImageView.setImageResource(int)' on a null object reference
    at com.example.dice.FiveDice.setImageViewDice(FiveDice.java:45)
    at com.example.dice.FiveDice.access$000(FiveDice.java:10)
    at com.example.dice.FiveDice$1.onClick(FiveDice.java:68)

感谢您帮助新人。

【问题讨论】:

    标签: android arrays android-studio nullpointerexception imageview


    【解决方案1】:

    嗯,你没有初始化你的 ImageViews,所以这是你的第一个问题。

    代替:

    private ImageView imageViewDiceOne;
    private ImageView imageViewDiceTwo;
    private ImageView imageViewDiceThree;
    private ImageView imageViewDiceFour;
    private ImageView imageViewDiceFive;
    private ImageView[] imageViewDice = new ImageView[]{imageViewDiceOne, imageViewDiceTwo, imageViewDiceThree, imageViewDiceFour, imageViewDiceFive};
    

    假设这是在 Activity 中,您需要执行以下操作:

    private ImageView[] imageViewDice;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        imageViewDice = new ImageView[5]; // Initialize array
    
        // Set each reference in the array to something valid
        imageViewDice[0] = findViewById<ImageView>(R.id.imageView1);
        imageViewDice[1] = findViewById<ImageView>(R.id.imageView2);
        imageViewDice[2] = findViewById<ImageView>(R.id.imageView3);
        imageViewDice[3] = findViewById<ImageView>(R.id.imageView4);
        imageViewDice[4] = findViewById<ImageView>(R.id.imageView5);
    }
    

    如果这没有意义,我建议暂时离开 Android,专注于学习 Java / Kotlin 并首先了解该语言的工作原理。

    希望有帮助!

    【讨论】:

    • 很抱歉没有发布我的 OnCreate。我已经在那里初始化了 ImageViews(不是使用数组索引,而是使用我最初帖子中提到的变量)。我已经尝试了您的代码,但仍然收到相同的错误。据我了解,您的代码中的所有不同之处在于图像视图是一一分配的,而不是直接写入数组中。正确的?还有其他可能是导致此错误的原因吗?感谢您的帮助!
    • 请发布导致问题的完整代码。我猜不出你的问题可能是什么。
    • 感谢您花时间和精力解决这个问题!我很感激它,并将尝试更好地表达未来的问题并发布更多可能相关的代码。我认为我确实发布了导致问题的完整代码 - OnCreate 工作正常。到目前为止,我已经对其进行了更改,所以现在 setImageViewDice() 方法不再包含循环/开关。因为这是唯一改变通过数组的循环或者开关一定会导致这种情况发生的事情,但我仍然不知道为什么或如何发生这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2021-10-06
    • 2019-11-10
    相关资源
    最近更新 更多