Для одного из моих назначений класса мне нужно было создать класс, который создает объекты треугольника. Согласно геометрическим правилам, для правильного треугольника длина любой стороны должна быть меньше суммарной длины двух других. Класс конструктора объекта, который я написал, может принимать любое значение типа double, что означает, что можно ввести одну сторону треугольника, которая длиннее, чем общая длина двух других. Это нарушает геометрическое правило для треугольников (это нормально). Однако я хочу отслеживать, сколько треугольников нарушили геометрическое правило и не удалось построить.

Обычно вы должны использовать блок try, catch, чтобы перехватить исключение. Однако проблема, с которой я столкнулся, заключается в том, что при достижении исключения объект, следующий за исключением, пропускается и не создается. Это вызывает две проблемы: во-первых, не создаются какие-либо легальные объекты, следующие за незаконным. Во-вторых, я не могу отслеживать, сколько объектов не удалось создать, кроме первого недопустимого (так как остальные пропускаются). Как я могу реструктурировать свой код, чтобы я мог создать легальный объект, даже ударив незаконный, и подсчитать, сколько легальных / незаконных? Я использовал пользовательский объект обработчика исключений, который я написал для треугольных объектов, но не включил сюда для сокращения кода. Я новичок, поэтому решение, которое может быть для вас очевидным, для меня непонятно. Ваша помощь очень ценится.

Вот мой код тестера Triangle:

public class TestTriangle {

    public static void main(String[] args) throws IllegalTriangleException {
        // Start of try block for creating 4 triangle objects
        try {
            
            Triangle triangle1 = new Triangle();            // create first triangle using default constructor
            System.out.println(triangle1.toString());       // output the information about length of sides
            // output info about perimeter and area of triangle
            System.out.println("The perimeter of the triangle1 is " + triangle1.getPerimeter()); 
            System.out.println("The area of the triangle1 is " + triangle1.getArea());           
            System.out.println();
            
            Triangle triangle2 = new Triangle(3, 4, 5);     // create a second triangle given sides
            System.out.println(triangle2.toString());
            System.out.println("The perimeter of the triangle2 is " + triangle2.getPerimeter());
            System.out.println("The area of the triangle2 is " + triangle2.getArea());
            System.out.println();
            
            Triangle triangle3 = new Triangle(4, 2, 5);     // create a third triangle given sides
            System.out.println(triangle3.toString());
            System.out.println("The perimeter of the triangle3 is " + triangle3.getPerimeter());
            System.out.println("The area of the triangle3 is " + triangle3.getArea());
            System.out.println();
            
            Triangle triangle4 = new Triangle(2, 3, 7);     // try to create an illegal triangle
            System.out.println(triangle4.toString());
            System.out.println("The perimeter of the triangle4 is " + triangle4.getPerimeter());
            System.out.println("The area of the triangle4 is " + triangle4.getArea());
            System.out.println();
            
            Triangle triangle5 = new Triangle(2, 4, 9);     // try to create an illegal triangle
            System.out.println(triangle5.toString());
            System.out.println("The perimeter of the triangle5 is " + triangle5.getPerimeter());
            System.out.println("The area of the triangle5 is " + triangle5.getArea());
            System.out.println();
            
        // catch exceptions, if any 
        } catch (IllegalTriangleException ex) {
            System.out.println("Exception: " + ex);
        }
        System.out.println();
        System.out.println(Triangle.getNumberOfObjects() + " triangles constructed");
        System.out.println(Triangle.illegalAttempts() + " triangle(s) failed to construct");        
    }
}

И вот конструктор класса, если вам нужно в него заглянуть:

public class Triangle {
    
    // declare variables for each side of the triangle
    private double side1;
    private double side2;
    private double side3;
    
    // declare variables to keep track of number of objects created or illegal attempts
    private static int numberOfObjects = 0;
    private static int illegalAttempts = 0;
    
    // default constructor for triangle
    public Triangle() {
        side1 = 1.0;
        side2 = 1.0;
        side3 = 1.0;
        numberOfObjects++;
    }
    
    // constructor for creating triangles based on length of sides
    public Triangle(double newSide1, double newSide2, double newSide3) throws IllegalTriangleException {
        setSides (newSide1, newSide2, newSide3);
    
        numberOfObjects++;
    }
    
    // setter for creating triangles given the length of sides
    public void setSides (double newSide1, double newSide2, double newSide3) throws IllegalTriangleException {
        // According to geometric rules, in triangles, any one side should be shorter than the combined length of other two. 
        // Check to see if any one side is longer than the combined length of other two. If so, throw the designed exception.
         
        if (newSide1 >= newSide2 + newSide3) { 
            illegalAttempts++;
            throw new IllegalTriangleException(newSide1, newSide2, newSide3);
            
        } else if (newSide2 >= newSide1 + newSide3) {
            illegalAttempts++;
            throw new IllegalTriangleException(newSide2, newSide1, newSide3);
            
        } else if (newSide3 >= newSide1 + newSide2) {
            illegalAttempts++;
            throw new IllegalTriangleException(newSide3, newSide1, newSide2);
        } else {
            
            side1 = newSide1;       // In case the geometric rule is not violated, create the sides. 
            side2 = newSide2;
            side3 = newSide3;
        }       
    }
    // constructor for getting the number triangle created
    public static int getNumberOfObjects() {
        return numberOfObjects;
    }
    
    public static int illegalAttempts() {
        return illegalAttempts;
    }
    // constructor for calculating the perimeter of triangles 
    public double getPerimeter() {
        return side1 + side2 + side3;
    }
    // constructor for calculating the area of a triangle given three sides: sqrt(p*(p-a)*(p-b)*(p-c))
    public double getArea() {
        double perimeter = side1 + side2 + side3;
        return Math.sqrt(perimeter * (perimeter - side1) * (perimeter - side2) * (perimeter - side3));
    }
    
    // create an string object giving information about the triangle
    public String toString() {
         return "Triangle: Side a = " + side1 + ", Side b = " + side2
                 + ", Side c = " + side3;
    }

}

Вывод кода должен быть примерно таким:

Треугольник: сторона a = 4,0, сторона b = 2,0, сторона c = 5,0. Периметр треугольника 3 равен 11,0. Площадь треугольника составляет 64,48255578061404.

Исключение: IllegalTriangleException: недопустимый треугольник, сумма любых двух сторон меньше, чем у другой стороны Сторона 1 равна 7,0 Сторона 2 равна 2,0 Сторона 3 равна 3,0

3 треугольника построены 2 треугольника (ов) построить не удалось

1
twicelost 30 Ноя 2020 в 21:27

1 ответ

Лучший ответ

Учитывая, что инициализации треугольников идентичны, за исключением их значений, одним из вариантов может быть извлечение ваших жестко запрограммированных значений из блока try. В случае, если какой-либо один треугольник не может быть построен, он будет пойман, обработан, а затем перейдет к следующему набору параметров треугольника.

public class TestTriangle {

    public static void main(String[] args) throws IllegalTriangleException {
        Triangle triangle1 = new Triangle();            // create first triangle using default constructor
        System.out.println(triangle1.toString());       // output the information about length of sides
        // output info about perimeter and area of triangle
        System.out.println("The perimeter of the triangle1 is " + triangle1.getPerimeter());
        System.out.println("The area of the triangle1 is " + triangle1.getArea());
        System.out.println();

        List<List<Integer>> triangleEdgeLengths = new ArrayList<>();
        triangleEdgeLengths.add(Arrays.asList(3, 4, 5));
        triangleEdgeLengths.add(Arrays.asList(4, 2, 5));
        triangleEdgeLengths.add(Arrays.asList(2, 3, 7));
        triangleEdgeLengths.add(Arrays.asList(2, 4, 9));

        triangleEdgeLengths.forEach((edgeLengths) -> {
            try {
                Triangle triangle = new Triangle(edgeLengths.get(0), edgeLengths.get(1), edgeLengths.get(2));
                System.out.println(triangle.toString());
                System.out.println("The perimeter of the triangle is " + triangle.getPerimeter());
                System.out.println("The area of the triangle is " + triangle.getArea());
                System.out.println();
                // catch exceptions, if any
            } catch (IllegalTriangleException ex) {
                System.out.println("Exception: " + ex);
            }
        });

        System.out.println();
        System.out.println(Triangle.getNumberOfObjects() + " triangles constructed");
        System.out.println(Triangle.illegalAttempts() + " triangle(s) failed to construct");
    }
}

Выход

Triangle: Side a = 1.0, Side b = 1.0, Side c = 1.0
The perimeter of the triangle1 is 3.0
The area of the triangle1 is 4.898979485566356

Triangle: Side a = 3.0, Side b = 4.0, Side c = 5.0
The perimeter of the triangle is 12.0
The area of the triangle is 77.76888838089432

Triangle: Side a = 4.0, Side b = 2.0, Side c = 5.0
The perimeter of the triangle is 11.0
The area of the triangle is 64.48255578061404

Exception: IllegalTriangleException
Exception: IllegalTriangleException

3 triangles constructed
2 triangle(s) failed to construct

Process finished with exit code 0

Doublelost запросил вариант, позволяющий избежать использования списков. Один из вариантов, который является немного подробным, может заключаться в том, чтобы обернуть каждую конструкцию треугольника в try / catch.

    public static void main(String[] args) throws IllegalTriangleException {
        Triangle triangle1 = new Triangle();            // create first triangle using default constructor
        System.out.println(triangle1.toString());       // output the information about length of sides
        // output info about perimeter and area of triangle
        System.out.println("The perimeter of the triangle1 is " + triangle1.getPerimeter());
        System.out.println("The area of the triangle1 is " + triangle1.getArea());
        System.out.println();

        try {
            Triangle triangle2 = new Triangle(3, 4, 5);     // create a second triangle given sides
            System.out.println(triangle2.toString());
            System.out.println("The perimeter of the triangle2 is " + triangle2.getPerimeter());
            System.out.println("The area of the triangle2 is " + triangle2.getArea());
            System.out.println();
        } catch (IllegalTriangleException ex) {
            System.out.println("Exception: " + ex);
        }

        try {
            Triangle triangle3 = new Triangle(4, 2, 5);     // create a third triangle given sides
            System.out.println(triangle3.toString());
            System.out.println("The perimeter of the triangle3 is " + triangle3.getPerimeter());
            System.out.println("The area of the triangle3 is " + triangle3.getArea());
            System.out.println();
        } catch (IllegalTriangleException ex) {
            System.out.println("Exception: " + ex);
        }

        try {
            Triangle triangle4 = new Triangle(2, 3, 7);     // try to create an illegal triangle
            System.out.println(triangle4.toString());
            System.out.println("The perimeter of the triangle4 is " + triangle4.getPerimeter());
            System.out.println("The area of the triangle4 is " + triangle4.getArea());
            System.out.println();
        } catch (IllegalTriangleException ex) {
            System.out.println("Exception: " + ex);
        }

        try {
            Triangle triangle5 = new Triangle(2, 4, 9);     // try to create an illegal triangle
            System.out.println(triangle5.toString());
            System.out.println("The perimeter of the triangle5 is " + triangle5.getPerimeter());
            System.out.println("The area of the triangle5 is " + triangle5.getArea());
            System.out.println();
        } catch (IllegalTriangleException ex) {
            System.out.println("Exception: " + ex);
        }

        System.out.println();
        System.out.println(Triangle.getNumberOfObjects() + " triangles constructed");
        System.out.println(Triangle.illegalAttempts() + " triangle(s) failed to construct");
    }
1
Jimbo McHiggins 30 Ноя 2020 в 19:22