java - 获取对象数量构造失败
问题描述
对于我的一个课堂作业,我需要创建一个创建三角形对象的类。根据几何规则,对于一个有效的三角形,任何给定边的长度都应该小于其他两条边的总和。我编写的对象构造器类可以采用任何双精度,这意味着可以输入比其他两个组合长度更长的三角形的一侧。这违反了三角形的几何规则(这没关系)。但是,我想跟踪有多少三角形违反了几何规则,因此无法构建。
通常,您会使用 try、catch 块来捕获异常。但是,我在这里遇到的问题是,一旦遇到异常,异常之后的对象就会被跳过而不是创建。这会导致两个问题:首先,非法对象之后的任何合法对象都不会被创建。其次,除了第一个非法对象之外,我无法跟踪有多少对象未能创建(因为跳过了其余对象)。我怎样才能重组我的代码,以便我可以创建合法对象,甚至击中一个非法对象并计算有多少合法/非法对象?我使用了我为三角形对象编写的自定义异常处理程序对象,但我没有在此处包含以减少代码。我是一个初学者,所以对你来说可能很明显的解决方案对我来说是模糊的。感谢您的帮助。
这是我的三角形测试器代码:
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 三角形 3 的面积为 64.48255578061404
例外:IllegalTriangleException:非法三角形,任何两条边的和小于另一边 边 1 是 7.0 边 2 是 2.0 边 3 是 3.0
3 个三角形构建 2 个三角形构建失败
解决方案
鉴于三角形初始化除了它们的值之外是相同的,一种选择可能是从 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
两次丢失请求避免使用列表的选项。一个有点冗长的选项可能是将每个三角形构造包装在 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");
}
推荐阅读
- javascript - 谷歌一键登录可以获取授权码吗?
- c++ - 将 C++ 类成员函数作为参数传递给 C 函数
- java - 异步进程在 javax.ws.rs.*(REST 客户端)中不起作用
- javascript - REACTJS : imageloaded 未定义
- c# - 从 JQUERY 传递数据 | AJAX 处理 ASP.NET
- json - 如何使用 PostgreSQL 查询 Jsonb 数据?
- excel - 在选定的 Cels 中删除行 Excel VBA
- python - Pandas:用另一个 DataFrame 替换 NaN
- c# - 多个数据库上下文到单个数据库
- python - 检查多个列的条件并创建新列