簡體   English   中英

Java:簡單但不尋常的NullPointerException

[英]Java: simple but unusual NullPointerException

我堅持通常非常簡單的事情。 調用這個簡單類的構造函數時,我得到一個NullPointerException:

import java.awt.geom.*;

public class Brick extends ColorShape {
        private int xPos = 0;
        private int yPos = 0;
        private int width = 0;
        private int height = 0;
        private Rectangle2D.Double shape;

        // constructor
        public Brick(int x, int y, int w, int h) {
            super(new Rectangle2D.Double(x, y, w, h));

            //set brick x, y, width, and height
            xPos = x;
            yPos = y;
            width = w;
            height = h;

            // update shape
            shape.setRect((double)xPos, (double)yPos, (double)width, (double)height);
        }

        public int getX() {
            return xPos;
        }

        public Rectangle2D.Double getShape() {
            return shape;
        }
    }

它以這種方式調用:

for (int i = 0; i < numCols; i++) {
            for (int j = 0; j < numRows; j++) {

                // initialize bricks[i][j]
                bricks[i][j].setLocation((double)(i*brickWidth), (double)(j*brickHeight));
                bricks[i][j].setSize((double)brickWidth, (double)brickHeight);
                //bricks[i][j] = new Brick(i*brickWidth, j*brickHeight, brickWidth, brickHeight);
                //bricks[i][j] = new Brick(0, 0, 0, 0);
            }
        }

無論我嘗試什么,我總是會嘗試初始化該類的NullPointerException。

編輯:

Tristan的建議以及將嵌套for循環更改為下面的代碼修復了它

// create new bricks and store them in bricks array
        for (int i = 0; i < numCols; i++) {
            for (int j = 0; j < numRows; j++) {


                // initialize bricks[i][j]
                //bricks[i][j].setLocation((double)(i*brickWidth), (double)(j*brickHeight));
                //bricks[i][j].setSize((double)brickWidth, (double)brickHeight);
                bricks[i][j] = new Brick(i*brickWidth, j*brickHeight, brickWidth, brickHeight);
                //bricks[i][j] = new Brick(0, 0, 0, 0);
            }
        }

我認為你不小心將形狀重新定義為未初始化的領域。 您調用setRect on的形狀尚未按您認為的方式初始化。

如果您嘗試訪問的父類中有一個形狀,只需將其修飾符設置為protected並刪除您發布的類中的私有形狀聲明。

/* REMOVE THIS */
private Rectangle2D.Double shape; // uninitialized!

// constructor
public Brick(int x, int y, int w, int h) {
    super(new Rectangle2D.Double(x, y, w, h));

    //set brick x, y, width, and height
    xPos = x;
    yPos = y;
    width = w;
    height = h;
    // update shape
    // This now references a protected instance variable inherited from the parent.
    shape.setRect((double)xPos, (double)yPos, (double)width, (double)height);
}

然而,通過這個構造函數,它似乎相當偏離。 如果父類本身具有形狀,為什么需要設置矩形的方式與在父類中設置它的方式不同?

例如,此代碼似乎在邏輯上是等效的。

// Call the parents constructor to set the shape of this brick..
public Brick(int x, int y, int w, int h) {
    super(new Rectangle2D.Double(x, y, w, h));
}

正如Tristan所提到的,初始磚構造函數的問題是已聲明形狀但未實例化。

也就是說,實例化形狀很簡單:

public Brick(int x, int y, int w, int h) {
    super(new Rectangle2D.Double(x, y, w, h));

    //set brick x, y, width, and height
    xPos = x;
    yPos = y;
    width = w;
    height = h;
    // update shape
    // This now references a protected instance variable inherited from the parent.
    shape = (Rectangle2D.Double)super.shape;
    shape.setRect(xPos, yPos, width, height);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM