【问题标题】:Null-Pointer Exception Error at toStringtoString 处的空指针异常错误
【发布时间】:2014-08-06 01:12:27
【问题描述】:

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

我怀疑我在调用 getter 方法时没有初始化任何字段,但事实并非如此。 setter 方法工作得很好——我已经成功地输入了值。这并不意味着我的 getter 方法可以访问一些非空值。

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;
    }

}

【问题讨论】:

    标签: java nullpointerexception


    【解决方案1】:

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

    Mypoint center = new Mypoint ();
    

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

    center = new Mypoint ();
    

    【讨论】:

      【解决方案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());
      }
      

      【讨论】:

        【解决方案3】:

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

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

        • 对象为空
        • object.center 为空
        • object.center.getCoordinateX() 或 getCoordinateY() 本身会引发异常。

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

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

        顺便说一句:在构造函数中使用输入扫描器是一种可怕的分层违规行为。您应该将输入/输出/用户交互逻辑与几何(圆形、点)类分开。

        【讨论】:

          【解决方案4】:

          除了@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;
          }
          

          【讨论】:

          • 感谢您的帮助。只是一个后续问题:如果想在 main 方法中获得输入,我应该怎么做。我无法在主方法中调用实例方法(getCoordinateX 和 getCoordinateY)。没有想到首先将输入从 main 传递到另一个方法然后传递到 getCoordinatex 的代码。
          • @user21945 double x = input.nextDouble(); double y = input.nextDouble(); MyPoint center = new MyPoint(x,y); MyCircle circle1 = new MyCircle (center, radius);
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-08
          • 1970-01-01
          • 2013-03-15
          • 2013-03-22
          相关资源
          最近更新 更多