2017-10-11 72 views
0

我有方法時,各方都知道,它計算三角形的角度:Testng。如何處理這個異常正確

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; 
} 

計算算法是正確的。關於例外的問題。它必須扔在這裏。

如何正確處理此異常(在此使用throwstry/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)); 
} 

你能幫我解決這個問題嗎?

+1

用'throws TriangleTechnicalException'聲明它。當調用該方法時,如果可以做到這一點,就用'try' /'catch' **來處理**,或者如果你不能這樣做,只需在該方法中添加'TriangleTechnicalException'即可。只有當你知道如何處理它們時才捕捉異常(無論這意味着重試,記錄警告,中止程序,無論如何)。 – Blorgbeard

+0

這取決於...你如何*希望*這種方法在這些條件下行爲。你是否希望它拋出異常?或者是其他東西?你如何*想要消耗代碼來處理它? – David

+0

@Blorgbeard,我想處理這個異常的方法有這種方法 - 'calculateTriangleAngles'。當我用'calculateTriangleAngles'方法使用'throws'時,我想這對測試這種方法來說不是很好。 在試驗中'try' /'catch'是很好的做法嗎? –

回答

1

您需要將throws添加到您的方法聲明中。

public static double[] calculateTriangleAngles(double a, double b, double c) throws TriangleTechnicalException { 

然後,每當你使用這種方法,你需要一個try塊內要麼做到這一點,或有一個方法也拋出TriangleTechnicalException

+0

這是可以理解的,謝謝。但是關於測試的問題。我可以在測試中使用try/catch嗎?如果不是,我怎樣才能以另一種方式解決這個問題? –

+0

或者我可以通過使用'public void testCalculateTriangleAnglesTrue()throws TriangleTechnicalException'來測試它嗎? –

+1

您可以在測試中使用try/catch。你有這個問題嗎?我會在你的例子中的catch中放置一個fail(),因爲它看起來不像應該拋出異常。如果要測試異常是否正確拋出,請在調用calculateTriangleAngles以調用無效邊後發生失敗。 – sn2k

1

我的建議是聲明calculateTriangleAngles拋出TriangleTechnicalException,即改變第一行爲

public static double[] calculateTriangleAngles(double a, double b, double c) 
    throws TriangleTechnicalException { 

這樣主叫方會被告知有問題。我相信,這比處理方法中的錯誤,並返回某種特殊值或(更糟糕的)一個假設值來解決錯誤或類似錯誤的值更好。

如果我沒有記錯,如果TriangleTechnicalExceptionRuntimeException的子類,則調用者不必捕捉異常;如果發生異常,它會冒泡直到某個調用者捕獲它,或者它到達頂層並且程序終止。所以測試用例不需要捕獲異常。但是您肯定會想要測試錯誤處理代碼,在這種情況下,您需要捕獲異常,以驗證錯誤處理是否按預期工作。