java - 首先调用构造函数或 onDraw()

标签 java android ondraw

我提到了this question但它没有提供我所询问的内容。

我有一些全局声明的变量,最初它们被分配为 NULL。在构造函数内部,我调用了一个名为 "newGame()" 的函数。 ,该函数初始化变量。里面onDraw()我正在尝试绘制一个文本,其中包含我在 newGame() 中初始化的变量之一的大小。函数,当我运行应用程序时,它崩溃了,并且 logCat说:NPE .

所以,我认为,如果首先调用构造函数,我的变量应该已经初始化,这样就不应该有 NPE 。但是,既然有NPE ,看来,onDraw()在构造函数之前调用,是这样吗?

Update_1

我还放置了newGame()里面的功能onSizeChanged()但是,我收到了同样的NPE

Update_2

我正在检查 hashmap 的对象是否为 null 或不如下所示: if (obj == null)检查对象是否为 null 是否正确?

Update_3

这是我初始化“手”的方法

if (hand == null) {
        Log.i(TAG, "@dealCards: Hand hashMap was NULL, it will be initialised");
        hand = new HashMap<Integer, Card>();
    }

代码

private HashMap<Integer, Card> deck = null;
private HashMap<Integer, Card> tableHand = null;
private HashMap<Integer, Card> myHand = null;
private HashMap<Integer, Card> compHand = null;
....
....
//CONSTRUCTOR
    public GameView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    mContext = context;
    scale = mContext.getResources().getDisplayMetrics().density;

    textPaint = new Paint();
    textBounds = new Rect();
    deckSize_String = "Deck_Size: ";
    cardArraySize_String = "cardsArraySize: ";

    textPaint.setAntiAlias(true);
    textPaint.setColor(Color.RED);
    textPaint.setStyle(Paint.Style.STROKE);
    textPaint.setTextAlign(Paint.Align.LEFT);
    textPaint.setTextSize(scale*15);

    newGame();
}
....
....
//OnDraw()
    protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.drawText("tableHand: "+tableHand.size(), 10, 200, textPaint);

}

private void newGame() {
    // TODO Auto-generated method stub
    Log.i(TAG, "@newGame()");

    initDeck();
    dealCards(deck, tableHand);
    myTurn = whosTurn();

    if (myTurn) {
        dealCards(deck, myHand);
        dealCards(deck, compHand);
    }else {
        dealCards(deck, myHand);
        dealCards(deck, compHand);
    }
}
...
...
...
 private void dealCards(HashMap<Integer, Card> deck, HashMap<Integer, Card> hand) {
    // TODO Auto-generated method stub
    if (hand == null) {
        Log.i(TAG, "@dealCards: Hand hashMap was NULL, it will be initialised");
        hand = new HashMap<Integer, Card>();
    }

    for (int i=0; i<4; i++) {
        hand.put( (hand.size()+1), deck.get( ((DECK_MAX_SIZE - deck.size())+1) ) );
        copyDealtCards( dealtCardsPile, deck.get( ((DECK_MAX_SIZE - deck.size())+1) ) );
        deck.remove( ((DECK_MAX_SIZE - deck.size())+1) );
    }
}

最佳答案

更新

看到你添加的代码,你在哪里初始化tableHand?

顺便说一句,最好将 tableHand 声明为 Map 而不是 HashMap,并使用 new HashMap<>() 对其进行初始化。

<小时/>

毫无疑问,构造函数。如果该对象首先不存在,则无法调用其实例方法。

关于java - 首先调用构造函数或 onDraw(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097212/

相关文章:

java - Hibernate关系注释

android - 当我在 ListView 中滚动后单击一行时,为什么会出现 CheckedTextView 的 NullPointerException?

android - 在 onDraw() 中使用线程

java - Mockito:模拟 "Blackbox"依赖项

java - JComboBox 事件 - Swing

java - Java if 语句中的 if

java - 如何隐藏特定 fragment Activity 的 "fab"按钮?

android - kotlin 注释中的错误?

android - 如何在 onDraw 方法中创建和显示 ListView ?

Android:SurfaceView 忽略 postInvalidate()?