簡體   English   中英

如何以遞歸方法返回try-catch內部?

[英]How to return inside a try-catch in a recursive method?

我不明白為什么我不能在代碼內返回值,它是:

private int depth(Position<Integer> p) {
    try{
        if (ab.isRoot(p))
            return 0;
        else 
            return 1+depth(ab.parent(p));
    }catch(InvalidPositionException | BoundaryViolationException e) {System.out.println(e.getMessage());}

}

它沒有檢測到回報。 我知道它在try-catch里面並且可以捕獲異常,但是我感到困惑,因為在我正在讀的書(數據結構和算法-Goodrich&Tamassia第4版)中,他沒有在參數中發送int(這可能在遞歸中有用以保存值)

編輯:解決了,謝謝大家!

它正在“檢測” return

只是在所有程序控制路徑上沒有明確的return :您需要在catch塊中返回某些內容。

就我個人而言,盡管我將函數本身標記為能夠拋出您當前catch的異常,並在調用站點處處理異常。 然后您的功能減少到

private int depth(
    Position<Integer> p
) throws InvalidPositionException, BoundaryViolationException 
{
    return ab.isRoot(p) ? 0 : 1 + depth(ab.parent(p));
}

您必須從catch塊返回,並且在發生異常的情況下,將永遠無法到達try塊內的return語句。

您的方法簽名表明它返回一個整數並且永不失敗(不會引發任何異常)。

您的實現不遵守該合同,如果在代碼中引發了異常,則可以捕獲該合同,但是在這種情況下,您不會返回任何值。

您可以通過兩種方式修復它。 您可以在catch塊中返回一個值,也可以刪除try catch塊,然后將要捕獲的異常添加到方法的簽名中。 哪種解決方案更好取決於代碼的確切功能以及如何使用它。

另外請記住捕獲異常,如果不小心記錄日志,則是不好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM