对象引用混淆

时间:2015-06-24 19:37:34

标签: java object reference

我在以下代码中收到NullPointerException on the MainClass.ob1.noOfVerts变量:

import java.awt.*;
import javax.swing.*;

public class drawr extends JPanel{

    public void paintComponent(Graphics g){

        super.paintComponent(g);
        g.setColor(Color.decode("#ffc000"));
        g.drawLine(0, 0, getWidth(), getHeight());
        for(int cnt=0; cnt/displayObject.dim*2<=**MainClass.ob1.noOfVerts**; cnt+=displayObject.dim*2){
            g.drawLine(MainClass.ob1.coords[cnt], MainClass.ob1.coords[cnt+1], MainClass.ob1.coords[cnt+2], MainClass.ob1.coords[cnt+3]);
        }
    }

该对象在此实例化:

import java.awt.Color;
import javax.swing.*;

public class MainClass{

    public static final int windowWidth = 1280;
    public static final int windowHeight = 640;
    public static boolean crash = false;

    public static displayObject **ob1**, ob2, ob3;

    public static void main(String[] args)
        throws InterruptedException {

        String colorString="#ff0000";
        int ob1verts[]={10,10,50,50,30,80};
        **displayObject ob1=new displayObject("#ff0000", ob1verts);**
        int ob2verts[]={30,50,70,90,130,180,75,30};
        displayObject ob2=new displayObject("#00ff00", ob2verts);
        int ob3verts[]={10,10,70,50,70,80,110,130,30,30};
        displayObject ob3=new displayObject("#0000ff", ob3verts);

使用此构造函数:

  public class displayObject {

        //  Each object is defined by a color, number of vertices, and dim (2,3,4) coordinate vertex locations
        //  Use dim to verify that the right number of vertices were sent

            public static int dim=2;

            public String color;
            **public int noOfVerts**;
            public int coords [];

            public displayObject (String col, int verts[]){

                if (verts.length%dim != 0){
                    System.out.printf ("Crap in!");
                    return;
                }
                this.coords=new int[verts.length+2];
                color=col;
                **noOfVerts=verts.length/dim;**
                for (int cnt=0; cnt<verts.length; cnt++){
                    coords[cnt]=verts[cnt];
                }
                coords[verts.length]=verts[0];  //make last vertex equal first to close the shape
                coords[verts.length+1]=verts[1];
            }

    }

我已经创建了一个静态变量,我认为它会引用具有适当指针的对象的特定内存空间。为什么对象引用空指针?

1 个答案:

答案 0 :(得分:1)

  

该对象在此实例化:

public static displayObject **ob1**, ob2, ob3;

不,那不是实例化任何东西。它是声明变量,但它的默认值为null。在某些时候,您需要为其分配一个非空值,例如

ob1 = new displayObject(...);

现在你有这个行:

displayObject ob1=new displayObject("#ff0000", ob1verts);

......但那不是一回事。这是声明一个完全独立的局部变量,并给 一个值。它恰好具有相同的名称(ob1),但它是一个不同的变量。您可能只需要将其更改为不是本地变量声明:

ob1 = new displayObject("#ff0000", ob1verts);

......和其他变量一样。

(另外,我强烈建议避免使用非私有字段,并开始遵循Java命名约定。)