toString处的空指针异常错误

时间:2014-08-06 01:12:28

标签: java nullpointerexception

我的toString方法中出现空指针异常错误。我不知道为什么。错误可以通过多种方式发生。最常见的是,声明了对象的引用,但对象本身仍未创建。我已声明并创建(初始化正确的单词?)Mycircle circle1 = new Mycircle ();Mypoint center = new Mypoint ();

我怀疑在调用我的getter方法时我没有初始化任何字段,但事实并非如此。 setter方法干净利落 - 我已成功输入值。这是否意味着我的getter方法可以访问某些非null值。

import java.util.Scanner;

public class MyCircle {

    private Mypoint center;
    private double radius;

    Scanner input = new Scanner (System.in);

    public MyCircle() {   
        radius = 0.0;
        Mypoint center = new Mypoint ();
        System.out.println("Enter coordinates here");
        center.setCoordinateX(input.nextDouble());
        center.setCoordinateY(input.nextDouble());
    }


    public String toString(MyCircle object) { 
        return "Circle @ " + "(" + object.center.getCoordinateX() + "," + 
          object.center.getCoordinateY() + ")" + ". Its radius is " + 
          object.radius;
    }

    public double calcArea(MyCircle object) { 
        double area = Math.pow(object.radius, 2) * Math.PI; 
        return area;
    }


    public static void main (String[]args) {   
        MyCircle circle1 = new MyCircle ();

        circle1.radius = 3.0;
        System.out.println(circle1.calcArea(circle1));
        System.out.println(circle1.toString(circle1));

    }

}




class Mypoint {

    private double posX;
    private double posY;

    public void setCoordinateX(double x) { 
        posX = x;
    }

    public void setCoordinateY(double y) { 
        posY = y;
    }

    public double getCoordinateX() {
        return posX;
    } 

    public double getCoordinateY() {
        return posY;
    }

}

4 个答案:

答案 0 :(得分:9)

在您的MyCircle构造函数中,您在此处创建了一个名为center的局部变量:

Mypoint center = new Mypoint ();

您可能想要的是初始化实例成员:

center = new Mypoint ();

答案 1 :(得分:2)

你的代码没有多大意义,大概就是这个

public String toString(MyCircle object)
{ 
  return "Circle @ " + "(" + object.center.getCoordinateX() + ","
      + object.center.getCoordinateY() + ")" 
      + ". Its radius is " + object.radius;
}

应该是

@Override
public String toString() {
  return "Circle @ (" + center.getCoordinateX() + ","
      + center.getCoordinateY()
      + "). Its radius is " + radius;
}

然后让我们修复你的构造函数,使用this让你知道你正在更新实例字段(而不是遮蔽它) -

public MyCircle() {
  this.radius = 0.0;
  this.center = new Mypoint(); // <-- this.center
  System.out.println("Enter coordinates here");
  this.center.setCoordinateX(input.nextDouble());
  this.center.setCoordinateY(input.nextDouble());
}

答案 2 :(得分:1)

首先,你的toString()方法是不典型的。您想要一个没有参数的Circle#toString()并生成一个自己的打印代表(即this而不是object =)。

如果出现以下情况,您的toString方法可能会失败:

  • object is null
  • object.center为null
  • object.center.getCoordinateX()或getCoordinateY()本身会抛出异常。

后一种情况在堆栈跟踪中可见,另外两种情况都显示与原因相同的行号。

看起来第二种情况是你的问题(填充局部变量而不是MyCircle的字段)。

BTW:在构造函数中使用输入扫描程序是一种可怕的分层违规。您应该从几何(环形,点)类中分离输入/输出/用户交互逻辑。

答案 3 :(得分:1)

除了@Mike指出的代码之外,你的代码还有很多问题。

在构造函数中获取用户的输入是不好的。您应该在main方法中获取输入,并将其传递给构造函数。此外,您不初始化半径。它仍然是0.0。

构造函数调用应该如下所示(传递给构造函数的MyPoint对象应该在调用构造函数之前初始化):

MyCircle circle1 = new MyCircle (center, radius);

构造函数应如下所示:

public MyCircle(MyPoint center, double radius)
{   
    this.radius = 0.0;
    this.center = center;
}

toStringcalcArea方法不需要参数。它们应该对当前对象(this)进行操作:

public String toString()
{ 
    return "Circle @ " + "(" + this.center.getCoordinateX() + "," + this.center.getCoordinateY() + ")" + ". Its radius is " + this.radius;
}