我的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;
}
}
答案 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方法可能会失败:
后一种情况在堆栈跟踪中可见,另外两种情况都显示与原因相同的行号。
看起来第二种情况是你的问题(填充局部变量而不是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;
}
toString
和calcArea
方法不需要参数。它们应该对当前对象(this)进行操作:
public String toString()
{
return "Circle @ " + "(" + this.center.getCoordinateX() + "," + this.center.getCoordinateY() + ")" + ". Its radius is " + this.radius;
}