【问题标题】:Illegal Triangle Exception非法三角异常
【发布时间】:2013-11-15 23:49:03
【问题描述】:

我的作业有问题,希望你们能帮助我。作业是这样的:

(IllegalTriangleException) 编程练习 11.1 定义了具有三个边的 Triangle 类。在三角形中,任何两条边的和都大于另一边。 Triangle 类必须遵守此规则。创建 IllegalTriangleException 类,并修改 Triangle 类的构造函数以在创建的三角形的边违反规则时抛出 IllegalTriangleException 对象,如下:

   /** Construct a triangle with the specified sides */
    public Triangle(double side1, double side2, double side3)
       throws IllegalTriangleException {
        //Implement it
    }

好的。这是三角形类。

import java.lang.Math;

public class Triangle extends GeometricObject {
 private double side1 = 1.0;
 private double side2 = 1.0;
 private double side3 = 1.0;

 public Triangle() {

}

 public Triangle(double side1, double side2, double side3) {
     this.side1 = side1;
     this.side2 = side2;
     this.side3 = side3;
}

 public double getSide1() {
    return side1;
}

 public double getSide2() {
    return side2;
}

 public double getSide3() {
    return side3;
}

 public void setSide1(double side1) {
    this.side1 = side1;
}

 public void setSide2(double side2) {
    this.side2 = side2;
}

 public void setSide3(double side3) {
    this.side3 = side3;
}

 public double getArea() {
     double p = getPerimeter() / 2;
     return Math.sqrt(p * ((p - side1) * (p - side2) * (p - side3)));
}

 public double getPerimeter() {
     return side1 + side2 + side3 ;
}

 public String toString() {
     return " Triangle: Side 1 = " + side1 + " Side 2 = " + side2
             + " Side 3 = " + side3;
}

}

IllegalTriangleException 类:

 public class IllegalTriangleException extends Exception {
private double perimeter;

 /** Construct an exception*/
  public IllegalTriangleException(double perimeter) {
    super( "The sum of any two sides is greater than the other side" +  perimeter);
    this.perimeter = perimeter;
}
 /**return the side*/
  public double getPerimeter() {
    return perimeter;
}
}

这是 TriangleWithException 类:

  public class TriangleWithException {
    //The perimeter of the triangle
    private double perimeter;
    private double side1 = 1.0;
    private double side2 = 1.0;
    private double side3 = -1.0;

    //Number of objects created
    private static int numberOfObjects = 0;

        //construct a triangle with perimeter 
    public TriangleWithException(double side1, double side2, double side3)  {

    }
    //Construct a triangle with a specified perimeter.
    public TriangleWithException(double newPerimeter) {
        setPerimeter(newPerimeter);
        numberOfObjects++;

    }
    //Return perimeter
    public double getPerimeter() {
        return perimeter;
    }

    //set new perimeter
    public void setPerimeter(double newPerimeter) throws IllegalArgumentException {
        if (newPerimeter >= 0)
            perimeter = newPerimeter;
        else
            throw new IllegalArgumentException("Any two sides needs to be grater than the other side");

    }
    // Return numberOFObjects
    public static int getNumberOfObjects() {
        return numberOfObjects;
    }

    //return area of triangle
    public double findArea() {
        double p = getPerimeter() / 2;
        return Math.sqrt(p * ((p - side1) * (p - side2) * (p - side3)));
    }
    }

最后是测试程序

public class TestTriangleWithException {
public static void main(String[] args) {
    try {
      new TestTriangleWithException(/** What goes here?*/);
      new TestTriangleWithException(/** What goes here?*/);
      new TestTriangleWithException(/** What goes here?*/);
}
    catch (IllegalTriangleException ex) {
        System.out.println(ex);
}
    System.out.println("Number of objects created: " + 
            TriangleWithException.getNumberOfObjects());
}
}
  class TriangleWithException {
//Perimeter
private double perimeter;

//number of objects created
private static int numberOfObjects = 0;

//Construct a triangle with a specified perimeter
public TriangleWithException() throws IllegalTriangleException {
    double side1; 
    double side2; 
    double side3;
}

//construcj a triangle 
public TriangleWithException(double newPerimeter)
throws IllegalTriangleException {
    if (newPerimeter >= 0)
        perimeter = newPerimeter;
        else
            throw new IllegalTriangleException(newPerimeter);

}

//Return numberofobjects
public static int getNumberOfObjects() {
    return numberOfObjects;

}

//Return the area of the triangle 
/** How do define getPerimeter for the type IllegalTriangleException?
 * How do i resolve side1, side2 and side3 as variables?*/
public double findArea() {
     double p = getPerimeter() / 2;
    return Math.sqrt(p * ((p - side1) * (p - side2) * (p - side3)));
}
}

所以,我目前面临的问题是这些

如果违反规则,我需要修改 Triangle 类的构造函数以抛出 IllegalTriangleException

我需要弄清楚Perimeter 是否是我需要的变量,而不是异常类中的边。

我是初学者,所以虽然解决方案对您来说似乎很明显,但它们并不适合我。

任何帮助将不胜感激。

【问题讨论】:

  • 要发布大量的代码。请只提供必要的东西。
  • 除了对 Triangle 类结构的一般指导外,我看不到 Circle 类的相关性,也不应该在这里。您似乎从字面上理解了 Circle 结构,但对半径采用有效性测试对 Triangle 不起作用。
  • 为什么异常有参数“perimeter”?你如何定义一个只有“周长”的三角形?
  • 我明白了,所以 Triangle 类正在正常运行。您是指所有类吗?
  • @CarlosHeuberger 哦,我一直在用我的第一语言编写它,但没有意识到这一点。 Triangle中不仅使用了perimeter吗?

标签: java exception io


【解决方案1】:

我想应该可以帮助你。我在构造函数中添加了选择语句,并帮助您使用了 Exception 类。如果你的 GeometricObject 类很好,那么这段代码应该适合你。

import java.util.Scanner;

public class TriangleWithException {

public static void main(String[] args) throws IllegalTriangleException {

    Scanner input = new Scanner(System.in);

    // create triangle
    Triangle triangle = new Triangle();
    boolean done = false;
    double side1 = 1.0;
    double side2 = 1.0;
    double side3 = 1.0;

    System.out.println("Enter three sides: ");

    while (!done) {
        try {
            side1 = input.nextDouble();
            side2 = input.nextDouble();
            side3 = input.nextDouble();
            triangle = new Triangle(side1, side2, side3);
            done = true;
        }
        catch (IllegalTriangleException ex) {
            System.out.println(ex.getMessage());
            System.out.print("Enter three sides:  ");
            input.nextLine();
        }
    }




    System.out.println("Enter a color:  ");
    String color = input.next();
    triangle.setColor(color);

    System.out.println("Enter true or false for triangle filled: ");
    boolean filled = input.nextBoolean();
    triangle.setFilled(filled);

    System.out.println();

    System.out.println(triangle.toString() + 
            "\narea: " + triangle.getArea() + 
            "\nperimeter " + triangle.getPerimeter() +
            "\ncolor: " + triangle.getColor() + 
            "\nfilled: " + triangle.isFilled());
}

}

原来的三角形类

class Triangle extends GeometricObject {

protected double side1 = 1.0;
protected double side2 = 1.0;
protected double side3 = 1.0;

public Triangle() {
}

public Triangle(double side1, double side2, double side3) throws   IllegalTriangleException {
    if (side1 >= side2 + side3)
        throw new IllegalTriangleException(side1);
    else if (side2 >= side1 + side3)
        throw new IllegalTriangleException(side2);
    else if (side3 >= side2 + side1)
        throw new IllegalTriangleException(side3);
    else {
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }

}

public double getSide1() {
    return side1;
}

public double getSide2() {
    return side2;
}

public double getSide3() {
    return side3;
}


public double getPerimeter() {
    return side1 + side2 + side3;
}

public double getArea() {
    double p = (side1 + side2 + side3) / 2;
    double area = Math.sqrt(p * (p - side1) * (p - side2) * (p - side3));
    return area;
}

@Override
public String toString() {
    return "Triangle side 1 = " + side1 + ", side 2 = " + side2 + ", side 3 = " + side3;
}
}

IllegaTriangleException 类

class IllegalTriangleException extends Exception {

private double side = 1.0;

public IllegalTriangleException(double side) {
    super(side + " is larger than other two combined");

} 

public double getSide1() {
    return side;
}

}

【讨论】:

    【解决方案2】:

    从三角形类开始:

    public class Triangle extends GeometricObject {
        private double side1;
        private double side2;
        private double side3;
    
        public Triangle(double side1, double side2, double side3) {
            this.side1 = side1;
            this.side2 = side2;
            this.side3 = side3;
        }
    
        ...
    }
    

    还有例外:

    public class IllegalTriangleException extends Exception {
    
        public IllegalTriangleException() {
        }
    
        public IllegalTriangleException(String message) {
            super(message);
        }
    
        ...
    
    }
    

    现在您必须添加用于检查三角形并最终引发异常的代码(仅结构,我不会完成整个工作):

    public class Triangle extends GeometricObject {
        private double side1;
        private double side2;
        private double side3;
    
        public Triangle(double side1, double side2, double side3) throws IllegalTriangleException {
            this.side1 = side1;
            this.side2 = side2;
            this.side3 = side3;
    
            if (E*R*R*O*R)
                thrown new IllegalTriangleException("Any two sides needs to be grater than the other side");
        }
    
        ...
    }
    

    【讨论】:

      【解决方案3】:

      在您的构造函数中,您只接受侧面,此时您应该检查 Exception

      所以,我们有:

      side_1 side_2 side_3

      这可以重新排列为:

      side_1 side_1 > side_2 - side_3
      side_1 > side_3 - side_2

      这简化为:

      side_1 side_1 > 绝对值(side_3 - side_2)

      所以,我们有:

      public TriangleWithException(double side1, double side2, double side3) 
                                  throws IllegalTriangleException {
          if (side1 >= side2 + side3 || side1 <= Math.abs(side3-side2))
              throw new IllegalTriangleException(yourMessage);
      
          //otherStuffInConstructor
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 2023-03-11
        • 1970-01-01
        • 2020-02-12
        • 2013-11-15
        • 1970-01-01
        相关资源
        最近更新 更多