При печати объекта с println в java (вызов toString) печатается NULL, а не результат, который я ожидал - PullRequest
1 голос
/ 03 августа 2020

Я работал над проектом, который включает использование абстрактных классов и методов. Идея в том, что у нас есть общий абстрактный класс Shape и три подкласса Circle , Triangle и Rectangle . Мне нужно вычислить площадь каждой фигуры, поэтому я определил абстрактный метод в классе Shape: calculateArea () , который возвращает площадь фигуры. Каждый подкласс переопределяет этот метод и вычисляет его площадь соответственно. У меня есть класс тестера DrawingApp, который создает массив из 10 случайных фигур и вычисляет общую площадь фигур. Теперь я просмотрел свой код, и лог c кажется правильным. В классе DrawingApp я создаю 10 различных объектов типа Shape, используя for-l oop, и генерируется случайное число от 1 до 3, если число равно 1, то мы создаем экземпляр Circle и наоборот (2 будет Прямоугольник и 3 для Треугольника). Теперь я думаю, что это кажется правильным, но после создания 10 случайных объектов я хотел бы распечатать область каждой отдельной формы. Поэтому я использовал для l oop, чтобы перебрать 10 созданных объектов и вызвать: System.out.println (randomShapes [i]). Теперь проблема, с которой я сталкиваюсь, заключается в том, что при итерации по 10 фигурам он печатает null 10 раз вместо печати области каждой фигуры. Я просматривал свой код несколько раз, но не могу понять, почему он это делает. Это ошибка NullPointerException? Я действительно смущен, и любая помощь будет очень полезной. Спасибо. Также ниже я перечислил следующие классы: DrawingApp. java, Shape. java и Circle. java. Я не перечислял другие классы (Rectangle и Triangle), потому что он делает то же самое, что и Circle. java, и единственное отличие - это формула.

DrawingApp. java

class DrawingApp {
    public static void main(String[] args) {
        Shape [] randomShapes = new Shape[10]; // an array of 10 random shapes: Circle, Triangle or Rectangle
        // create 10 random shapes
        for(int i = 0; i < randomShapes.length; i++) {
            double randomNumber = Math.random() * (3 - 1 + 1) + 1; // generates a random between 1 and 3
            // circle
            if(randomNumber == 1) {
                double circleRadius = Math.random() * (10 - 1 + 1) + 1; // generates a random between 1 and 10
                randomShapes[i] = new Circle("Circle", circleRadius);
            }
            // rectangle
            else if(randomNumber == 2) {
                double length = Math.random() * (10 - 1 + 1) + 1; // generates a random between 1 and 10
                double width = Math.random() * (10 - 1 + 1) + 1; // generates a random between 1 and 10
                randomShapes[i] = new Rectangle("Rectangle", length, width);
            }
            // triangle
            else if(randomNumber == 3) {
                double height = Math.random() * (10 - 1 + 1) + 1; // generates a random between 1 and 10
                double base = Math.random() * (10 - 1 + 1) + 1; // generates a random between 1 and 10
                randomShapes[i] = new Triangle("Triangle", height, base);
            }
        }
        // prints null instead of area of that shape
        for(int i = 0; i < randomShapes.length; i++){
            System.out.println(randomShapes[i]); // call toString and display shape name, id, and area
        }
    }
}

Форма. java

abstract class Shape {
    protected static int id = 0; // id for each shape
    protected String label; // the shape label
    
    public Shape(String label) {
        id++;
        this.label = label;
    }
    public abstract double calculateArea(); // abstract method for calculating the area of a shape

    // getters and setters 
    public static int getId() {
        return id;
    }
    public String getLabel() {
        return label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
}

Круг. java

class Circle extends Shape {
    private double radius;

    public Circle(String label, double radius) {
        super(label);
        this.radius = radius;
    }
    @Override
    public double calculateArea() {
        double area = Math.PI * Math.pow(radius, 2);
        return area;
    }

    @Override
    public String toString() {
        return "Id = " + super.getId() + ". Shape = " + super.getLabel() + ". Area = " + this.calculateArea();
    }
}

Вывод (отказ от ответственности: точки круга не печатаются. Это просто список для StackOverflow.

  • null
  • null
  • null
  • null
  • null
  • null
  • null
  • null
  • null
  • ноль
...