Реализация моего класса Point and Line с использованием OOP - Ошибка: исключение нулевого указателя - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь написать свой собственный класс Point and Line (хотя подобный код можно найти в Интернете). Я делаю это, чтобы попрактиковаться в создании базового c кода с нуля. Я получил ошибку исключения из нулевого указателя, и я хотел бы, чтобы кто-то помог мне указать, что я делаю неправильно и как решить эту проблему здесь. спасибо!

Это мой класс Point:

public class Point {
    private double x;
    private double y;

public Point() {
    this.x = 0.0;
    this.y = 0.0;
}
public Point(double x, double y) {
    this.x = x;
    this.y = y;
}
public void setX(double x) {
    this.x = x;
}
public void setY(double y) {
    this.y = y;
}
public double getX() {
    return this.x;
}
public double getY() {
    return this.y;
}
public String toString() {
    return "(" + this.x + ", " + this.y + ")";
}
public static void main(String[] args) {
    Point p = new Point(1.5, 3);
        System.out.println(p.toString());
}

}

Это мой класс Line:

public class Line {
    private Point p1;
    private Point p2;

public Line() {
    p1 = new Point(0,0);
    p2 = new Point(0,0);
}

public Line(double x1, double y1, double x2, double y2) {
    p1 = new Point(x1, y1);
    p2 = new Point(x2, y2);
}
public Line(Point p1, Point p2) {
    p1 = new Point(p1.getX(), p1.getY());
    p2 = new Point(p2.getX(), p2.getY());
}
public Point getP1() {
    return this.p1;
}
public Point getP2() {
    return this.p2;
}
public void setP1(double x, double y) {
    this.p1 = new Point (x, y);
}
public void setP2(double x, double y) {
    this.p2 = new Point(x, y);
}
public double getSlope() {
    return ((p2.getY() - p1.getY()) / (p2.getX() - p1.getX()));
}
public static void main(String[] args) {
    Point p1 = new Point(0, 3);
    Point p2 = new Point(5, 5);
    Line l = new Line(p1, p2);
    System.out.println(l.getSlope()); //Threw an error at this point!!
}

} Я получил ноль ошибка исключения указателя для моего класса линии, хотя моя точка зрения - класс. Может кто-нибудь объяснить мне, как решить проблему здесь?

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Никаких изменений в исходном коде класса Point не требуется

 public class Point { 
      private double x;
      private double y;

    public Point() {
        this.x = 0.0;
        this.y = 0.0;
    }
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public void setX(double x) {
        this.x = x;
    }
    public void setY(double y) {
        this.y = y;
    }
    public double getX() {
        return this.x;
    }
    public double getY() {
        return this.y;
    }
    public String toString() {
        return "(" + this.x + ", " + this.y + ")";
    }
    public static void main(String[] args) {
        Point p = new Point(1.5, 3);
        System.out.println(p.toString());
    }
}

Пожалуйста, измените свой код в классе Line следующим образом

public class Line {
     private Point p1;
     private Point p2;

    public Line() {
        p1 = new Point(0,0);
        p2 = new Point(0,0);
    }

    public Line(double x1, double y1, double x2, double y2) {
        p1 = new Point(x1, y1);
        p2 = new Point(x2, y2);
    }
    public Line(Point p1, Point p2) {
        this. p1 = new Point(p1.getX(), p1.getY());//add this.p1 instead of p1
        this.p2 = new Point(p2.getX(), p2.getY());//add this.p2 intead of p2
    }
    public Point getP1() {
        return this.p1;
    }
    public Point getP2() {
        return this.p2;
    }
    public void setP1(double x, double y) {
        this.p1 = new Point (x, y);
    }
    public void setP2(double x, double y) {
        this.p2 = new Point(x, y);
    }
    public double getSlope() {
        return ((p2.getY() - p1.getY()) / (p2.getX() - p1.getX()));
    }
    public static void main(String[] args) {
        Point p1 = new Point(0, 3);
        Point p2 = new Point(5, 5);
        Line l = new Line(p1, p2);
        System.out.println(l.getSlope()); //Threw an error at this point!!
    }
}

Outout для заданных входов: 0,4

Объяснение: Вы пытаетесь назначить свои ссылочные переменные p1 и p2 (которые являются параметрами метода в перегруженной строке двух аргументов) конструктор) в переменные вашего экземпляра класса p1 и p2. Но в этом случае ваш метод также содержит те же параметры метода имени, что и переменные экземпляра в классе, поэтому в этом случае параметры вашего метода не будут назначены переменным экземпляра ваш класс. Объекты, которые генерируются после новой точки (p1.getX (), p1.getY ()) и новой точки (p2.getX (), p2.getY ()), будут снова назначены параметрам метода p1 и p2.

РЕШЕНИЕ 1: (что я и сделал в приведенном выше коде) Если вы используете одно и то же имя в переменных экземпляра и параметрах метода, используйте this ключевое слово я В случаях обращения с переменными экземпляра.

РЕШЕНИЕ 2: использует разные имена переменных для параметров метода и переменных экземпляра.

0 голосов
/ 10 января 2020

Вам нужно вызвать this.p1 / p2, потому что здесь вы изменяете только параметры конструктора.

public Line(Point p1, Point p2) {
  this.p1 = new Point(p1.getX(), p1.getY());
  this.p2 = new Point(p2.getX(), p2.getY());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...