Java 引发NullPointerException,但对象已创建并正确返回值

Java 引发NullPointerException,但对象已创建并正确返回值,java,nullpointerexception,java.util.scanner,Java,Nullpointerexception,Java.util.scanner,使用一个程序,该程序将形状库保存在文件夹和指令文件中(描述图形的细节)。尝试开发draw()方法时遇到问题(有一个来自main的调用)。main首先创建9个图形,然后绘制所有图形。 调用draw()时,将围绕以下对象引发NullPointerException: DrawingPanel dp = new DrawingPanel(canvasI.getWidth(), canvasI.getHeight()) 为什么??如果你需要更多的细节,请告诉我 private ArrayList al

使用一个程序,该程序将形状库保存在文件夹和指令文件中(描述图形的细节)。尝试开发
draw()
方法时遇到问题(有一个来自main的调用)。main首先创建9个图形,然后绘制所有图形。 调用
draw()
时,将围绕以下对象引发NullPointerException:

DrawingPanel dp = new DrawingPanel(canvasI.getWidth(), canvasI.getHeight())
为什么??如果你需要更多的细节,请告诉我

private ArrayList allShapes;
私有ArrayList allDrawInstructions;
私人拉票;
私人提款指示提款;
公共图形(ShapeLibrary shapeLib,File oneShape)引发FileNotFoundException{
试一试{
allDrawInstructions=new ArrayList();
扫描仪输入=新扫描仪(oneShape);
CanvasInstruction canvasI=CanvasInstruction.readFromFile(in);
while(在.hasNextLine()中){
DrawInstruction DrawInstruction=DrawInstruction.readFromFile(in);
所有DrawInstructions.add(drawI);
}
}catch(filenotfounde异常){
抛出新的FileNotFoundException(“文件不存在”);
}
}
公众抽签(){
DrawingPanel dp=新的DrawingPanel(canvasI.getWidth(),
canvasI.getHeight());
}

CanvasInstruction canvasI=CanvasInstruction.readFromFile(in)行的局部变量内部构造函数隐藏
private canvasI指令canvasI
字段。更改代码如下:-

public Drawing(ShapeLibrary shapeLib, File oneShape) throws FileNotFoundException {
    //...
    Scanner in = new Scanner(oneShape);
    this.canvasI = CanvasInstruction.readFromFile(in);
    //...
}

所以你在canvasI上得到了一个NullpointerException。 这是因为在构造函数中不初始化类变量,而是初始化局部变量

public Drawing(ShapeLibrary shapeLib, File oneShape) throws FileNotFoundException{
    try{
        allDrawInstructions = new ArrayList<DrawInstruction>();
        Scanner in = new Scanner(oneShape);
        this.canvasI = CanvasInstruction.readFromFile(in);
        while(in.hasNextLine()){
            DrawInstruction drawInstruction = DrawInstruction.readFromFile(in);
            allDrawInstructions.add(drawI);
        }
    } catch(FileNotFoundException e){
        throw new FileNotFoundException("File doesn't exist");
    }
}
公共图形(ShapeLibrary shapeLib,File oneShape)引发FileNotFoundException{
试一试{
allDrawInstructions=new ArrayList();
扫描仪输入=新扫描仪(oneShape);
this.canvasI=CanvasInstruction.readFromFile(in);
while(在.hasNextLine()中){
DrawInstruction DrawInstruction=DrawInstruction.readFromFile(in);
所有DrawInstructions.add(drawI);
}
}catch(filenotfounde异常){
抛出新的FileNotFoundException(“文件不存在”);
}
}

这将初始化您的类变量。

您的问题是您声明了一个变量来保存CanvasInstruction canvasI对象两次。您在try{}块中创建的变量没有分配给您在第3行周围实例化的变量canvasI。它正在创建一个仅在绘图范围内可用的。然后,当调用canvasI.getHeight()时,它引用的是第3行的对象变量。在那个点上实际上是空的

public Drawing(ShapeLibrary shapeLib, File oneShape) throws FileNotFoundException{
    try{
        allDrawInstructions = new ArrayList<DrawInstruction>();
        Scanner in = new Scanner(oneShape);
        this.canvasI = CanvasInstruction.readFromFile(in);
        while(in.hasNextLine()){
            DrawInstruction drawInstruction = DrawInstruction.readFromFile(in);
            allDrawInstructions.add(drawI);
        }
    } catch(FileNotFoundException e){
        throw new FileNotFoundException("File doesn't exist");
    }
}
你会想改变的

CanvasInstruction canvasI = CanvasInstruction.readFromFile(in); 


CanvasInstruction canvasI=CanvasInstruction.readFromFile(in)
将创建一个新的局部变量,该变量仅在所创建的方法内部可用。如果要设置字段变量的值,请将其更改为
canvasI=CanvasInstruction.readFromFile(in)太棒了。我知道这是一些基本的东西,但我不能把我的手指放在它上面。它不是类变量。相反,
private canvasI指令canvasI
是一个实例或对象变量。我对此解释不好,但它被定义为类范围变量(或成员变量)