如何修复仅在手机上一直出现的空对象?

时间:2019-04-19 18:25:58

标签: android

我对Android Studio有问题。我正在尝试做一个非常简单的应用程序,但是在我的手机(Galaxy S8)上,它总是给我同样的错误。我使用两台计算机,在家里和学校都可以做到。当我使用模拟器时,一切都很好。

1 个答案:

答案 0 :(得分:0)

尝试以下防御性编程代码。这样可以避免NPE问题,但根本原因是:

  1. 您应该使用某些“设计模式”来重构游戏代码(请尝试使用MVC)。您不应基于TextView字符串值来进行游戏逻辑决策。

  2. 某些UI树节点可能已在循环内更改。

public boolean checkEndOfGame(LinearLayout cartes, LinearLayout piles){
        if(nbCartes == 0){
            return true;
        }
        for (int i=0; i< piles.getChildCount(); i++){
            LinearLayout sorte = (LinearLayout)piles.getChildAt(i);
            for(int j=0; j< sorte.getChildCount(); j++){
                View sorteChild = sorte.getChildAt(j);
                if(sorteChild instanceof ConstraintLayout){
                    ConstraintLayout pile = (ConstraintLayout)sorteChild;
                    if(0 == pile.getChildCount) {
                        Log.e("TAG", "pile's child count = 0 ");
                        continue; //or break ?
                    }
                    View pileChild = pile.getChildAt(0);
                    if(pileChild instanceof TextView) {
                        TextView textePile = (TextView) pileChild;
                        int noPile = Integer.valueOf(textePile.getText());
                        for(int k=0; k< cartes.getChildCount(); k++){
                            View cartesChild = cartes.getChildAt(i);
                            if(cartesChild instanceof LinearLayout) {
                                LinearLayout rangee = (LinearLayout)cartesChild;
                                for(int l=0; l< rangee.getChildCount(); l++){
                                    View carteChild = rangee.getChildAt(l);
                                    if(carteChild instanceof ConstraintLayout) {
                                        ConstraintLayout carte = (ConstraintLayout)carteChild;
                                        View tv = carte.getChildAt(0);
                                        if(tv instanceof TextView) {
                                            TextView texteCarte = (TextView) tv;
                                            int noCarte = Integer.valueOf(texteCarte.getText());
                                            if(i>0){ //UP
                                                if(noCarte>noPile){
                                                    return false;
                                                }
                                            }else{ //DOWN
                                                if(noCarte<noPile){
                                                    return false;
                                                }
                                            }
                                        }

                                    }

                                }
                            }

                        }
                    }

                }
            }
        }
        return true;
    }