我有计算所有边都已知的三角形角度的方法:
public static double[] calculateTriangleAngles(double a, double b, double c) {
if (a <= 0 || b <= 0 || c <= 0 || a >= b + c || b >= a + c || c >= a + b) {
throw new TriangleTechnicalException("Incorrect side value");
}
double[] angles = new double[3];
angles[0] = round(Math.toDegrees(Math.acos((pow(b, 2) + pow(c, 2) - pow(a, 2)) / (2 * b * c))), 2);
angles[1] = round(Math.toDegrees(Math.acos((pow(a, 2) + pow(c, 2) - pow(b, 2)) / (2 * a * c))), 2);
angles[2] = round(Math.toDegrees(Math.acos((pow(a, 2) + pow(b, 2) - pow(c, 2)) / (2 * a * b))), 2);
return angles;
}
计算算法是正确的。关于例外的问题。它必须扔在这里。
如何正确处理此异常(在这里或其他地方使用throws
或try
/ catch
?)?或者可能更好地抛出它(但是这种方法看起来不正确,在测试中包围try
/ catch
)?
@Test
public void testCalculateTriangleAnglesTrue() {
double[] expResult = {48.19, 58.41, 73.4};
double[] result = new double[3];
try {
result = TriangleFunctional.calculateTriangleAngles(7, 8, 9);
} catch (TriangleTechnicalException e) {
fail();
}
assertTrue(Arrays.equals(expResult, result));
}
你能帮我解决这个问题吗?
答案 0 :(得分:1)
您需要在方法声明中添加throws。
public static double[] calculateTriangleAngles(double a, double b, double c) throws TriangleTechnicalException {
然后,无论何时使用此方法,您都需要在try块内执行此操作,或者让该方法也抛出TriangleTechnicalException
答案 1 :(得分:1)
我的建议是宣布calculateTriangleAngles
抛出TriangleTechnicalException
,即将第一行改为
public static double[] calculateTriangleAngles(double a, double b, double c)
throws TriangleTechnicalException {
以便通知来电者有问题。我相信,这比处理方法中的错误并返回某种特殊值或(甚至更糟)一个假定值来解决错误或类似值的值要好得多。
如果我没记错的话,如果TriangleTechnicalException
是RuntimeException
的子类,那么调用者就不必捕获异常;如果发生异常,它将冒泡直到某个调用者捕获它,或者它到达顶层并且程序终止。因此测试用例无需捕获异常。但是你肯定想测试错误处理代码,在这种情况下你需要捕获异常,以验证错误处理是否按预期工作。