Я работал над проектом, который включает использование абстрактных классов и методов. Идея в том, что у нас есть общий абстрактный класс 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
- ноль