【发布时间】:2019-11-16 09:43:28
【问题描述】:
这是 TriangleExtra 类的代码。它构造了 3 个边的三角形(用 Java 编写):
public class TriangleExtra extends SimpleGeometricObject {
private double side1;
private double side2;
private double side3;
private static int numberOfObjects;
//Constructor 1
public TriangleExtra() throws IllegalTriangleException {
super("Yellow", false);
numberOfObjects += 1;
try {
checkLegality(1, 1, 1);
setSide1(1);
setSide2(1);
setSide3(1);
} catch (IllegalTriangleException ex) {
ex.printStackTrace();
}
} // end constructor 1
//Constructor 2
public TriangleExtra(double side) throws IllegalTriangleException {
super("Blue", true);
numberOfObjects += 1;
try {
checkLegality(side, side, side);
setSide1(side);
setSide2(side);
setSide3(side);
} catch (IllegalTriangleException ex) {
ex.printStackTrace();
}
} // end contructor 2
//Contructor 3
public TriangleExtra(double side1, double side2, double side3) throws IllegalTriangleException {
super("Red", false);
numberOfObjects += 1;
try {
checkLegality(side1, side2, side3);
setSide1(side1);
setSide2(side2);
setSide3(side3);
} catch (IllegalTriangleException ex) {
ex.printStackTrace();
}
} // end constructor 3
//Check if it's valid triangle
public boolean checkLegality (double side1, double side2, double side3)
throws IllegalTriangleException {
boolean testSides = (side3 + side2 > side1) &
(side1 > Math.abs(side3 - side2));
boolean testPositive = (side1 > 0 & side2 > 0 & side3 > 0);
if (testSides & testPositive)
return true;
else
throw new IllegalTriangleException(side1, side2, side3);
} // end checkLegality
//Get side methods
public double getSide1() {
return this.side1;
}
public double getSide2() {
return this.side2;
}
public double getSide3() {
return this.side3;
} // end get sides
//Set side methods
private void setSide1(double side1) {
this.side1 = side1;
}
private void setSide2(double side2) {
this.side2 = side2;
}
private void setSide3(double side3) {
this.side3 = side3;
} // end set sides
//get area
public double getArea() {
double s = (side1 + side2 + side3) / 2;
double area = Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
return area;
} // end get Area
// get perimeter
public double getPerimeter() {
return side1 + side2 + side3;
} // end get Perimeter
public boolean equals(Object other) {
return (this.getSide1() == ((Triangle)other).getSide1() &
this.getSide2() == ((Triangle)other).getSide2() &
this.getSide3() == ((Triangle)other).getSide3());
} // end equal()
//get nr of objects (eve if invalid)
public static int getNrOfObjects() {
return numberOfObjects;
}
//to string
@Override
public String toString() {
String s = isFilled() ? "yes": "no";
return "Sides: " + side1 + " " + side2 + " " + side3 +
"\nBuilt on " + getDateBuilt() + "\ncolor: " +
getColor() + "\nFilled: " + s;
} // end toString
}
这是上面的类在其 checkLegality 方法中使用的 IllegalTriangleException:
public class IllegalTriangleException extends Exception {
private double side1;
private double side2;
private double side3;
public IllegalTriangleException (double side1,
double side2, double side3) {
super("Invalid triangle with sides " + side1 + " "
+ side2 + " and " + side3);
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
}
这是我测试运行 TriangleExtra 对象的另一个类:
public class TriangleExtraTry {
public static void main(String[] args) {
try {
TriangleExtra tr1 = new TriangleExtra(5);
tr1.checkLegality(5, -1, 5);
TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
TriangleExtra tr4 = new TriangleExtra(0, 5, 4);
} catch (IllegalTriangleException ex) {
System.out.println(ex);
}
System.out.println("Number of objects constructed: " +
TriangleExtra.getNrOfObjects());
}
}
这是我得到的输出:
IllegalTriangleException: Invalid triangle with sides 1000.0 1.0 and 1.0
at TriangleExtra.checkLegality(TriangleExtra.java:63)
at TriangleExtra.<init>(TriangleExtra.java:44)
at TriangleExtraTry.main(TriangleExtraTry.java:7)
IllegalTriangleException: Invalid triangle with sides -5.0 5.0 and 5.0
at TriangleExtra.checkLegality(TriangleExtra.java:63)
at TriangleExtra.<init>(TriangleExtra.java:44)
at TriangleExtraTry.main(TriangleExtraTry.java:8)
IllegalTriangleException: Invalid triangle with sides 0.0 5.0 and 4.0
at TriangleExtra.checkLegality(TriangleExtra.java:63)
at TriangleExtra.<init>(TriangleExtra.java:44)
at TriangleExtraTry.main(TriangleExtraTry.java:9)
IllegalTriangleException: Invalid triangle with sides 5.0 -1.0 and 5.0
Number of objects constructed: 4
当我从上面的代码中删除行 tr1.checkLegality(5, -1, 5); 并从 TriangleExtra 的构造函数方法中推迟“抛出 IllegalTriangleException”时,它不起作用,它只是说“IllegalTriangleException 的无法到达的捕获块。这个异常永远不会被抛出来自 try 语句体”。如果我只删除tr1.checkLegality(5, -1, 5);,那么它不会写最后一行IllegalTriangleException: Invalid triangle with sides 5.0 -1.0 and 5.0
当我写这个时:
public class TriangleExtraTry {
public static void main(String[] args) {
try {
TriangleExtra tr1 = new TriangleExtra(5);
TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
TriangleExtra tr4 = new TriangleExtra(0, 5, 4);
tr1.checkLegality(5, -5, 3);
} catch (IllegalTriangleException ex) {
throw ex;
}
System.out.println("Number of objects constructed: " +
TriangleExtra.getNrOfObjects());
}
}
它说“未处理的异常类型”。我不明白发生了什么?
我需要更改什么,以便它只打印出来(IllegalTriangleException: Invalid triangle with side1 side2 and side3),而不必在 TryTriangleExtra 上调用方法 xx.checkLegality?
我的意思是没有这条线tr1.checkLegality(5, -5, 3);
我如何只得到这个输出:
IllegalTriangleException: Invalid triangle with sides 1000.0 1.0 and 1.0
IllegalTriangleException: Invalid triangle with sides -5.0 5.0 and 5.0
IllegalTriangleException: Invalid triangle with sides 0.0 5.0 and 4.0
Number of objects constructed: 4
使用此尝试代码:
public class TriangleExtraTry {
public static void main(String[] args) {
try {
TriangleExtra tr1 = new TriangleExtra(5);
TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
TriangleExtra tr4 = new TriangleExtra(0, 5, 4);
} catch (IllegalTriangleException ex) {
// something code
}
System.out.println("Number of objects constructed: " +
TriangleExtra.getNrOfObjects());
}
}
【问题讨论】: