为什么代码在“返回”后仍在运行

时间:2015-06-28 16:15:49

标签: java recursion

我发现我的代码在点击“返回表”后仍在运行; (我已经运行了调试模式并且它真的向前移动到下一行,为什么一旦调用return语句,我的函数不应该立即结束(退出)?我的递归是否有问题?

public static HtmlTable getTableFromDomElement(DomElement element) throws Exception{

    if(element instanceof com.gargoylesoftware.htmlunit.html.HtmlTable){
        System.out.println("----YES!!!!-----");
        HtmlTable table = (HtmlTable) element;
        return table;
    }

    for(DomElement e : element.getChildElements()){         
            getTableFromDomElement(e);
        }

    throw new Exception("No HTML table found");
}

输出:

----YES!!!!-----

Exception in thread "main" java.lang.Exception: No HTML table found

1 个答案:

答案 0 :(得分:5)

你需要在找到时停止搜索,但是你没有停止for循环。相反,返回null表示“未找到”的情况,并在第一次看到非空时返回:

public static HtmlTable getTableFromDomElement(DomElement element) throws Exception {
    HtmlTable table;

    if(element instanceof HtmlTable){
        System.out.println("----YES!!!!-----");
        table = (HtmlTable) element;
        return table;
    }

    for(DomElement e : element.getChildElements()){         
         table = getTableFromDomElement(e);
         if (table != null) {
             return table;
         }
    }

    return null;
}

(如果该代码没有调用,则删除throws Exception不再抛出异常。)另请注意,因为您明确导入com.gargoylesoftware.htmlunit.html(否则,您的HtmlTable返回类型声明将不会'工作),com.gargoylesoftware.htmlunit.html.HtmlTable检查中不需要instanceof。只需HtmlTable即可。

如果你需要一个在找不到时抛出的版本,它必须是一个包装函数。

public static HtmlTable getTableFromDomElementOrThrow(DomElement element) throws Exception{
    HtmlTable table = getTableFromDomElement(element);
    if (table == null) {
        throw new Exception("No HTML table found");
    }
    return table;
}

(好吧,它没有成为一个包装器函数,你可以在循环的每次迭代中捕获异常,但由于没有表的子元素不是特殊条件,它不适合抛出异常。在每次循环迭代中抛出异常也会显着降低效率。)

或者这是一个只在一个地方返回的重构版本(有时被认为是良好实践):

public static HtmlTable getTableFromDomElement(DomElement element) throws Exception {
    HtmlTable table = null;

    if(element instanceof HtmlTable){
        System.out.println("----YES!!!!-----");
        table = (HtmlTable) element;
    } else {
        for (DomElement e : element.getChildElements()){         
             table = getTableFromDomElement(e);
             if (table != null) {
                 break;
             }
        }
    }

    return table;
}
相关问题