java - 为什么代码在 "return"之后仍在运行

标签 java recursion

我发现我的代码在点击“return table;”后仍在运行(我已经运行了 Debug模式,它确实前进到了下一行,怎么回事?一旦调用 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");
}

输出:

----是!!!-----

线程“main”java.lang.Exception中出现异常:未找到 HTML 表

最佳答案

找到后需要停止搜索,但不会停止 for 循环。相反,对于“未找到”的情况返回 null 并在第一次看到非 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;
}

(如果代码调用不再抛出异常,请删除抛出异常。)另请注意,因为您明确导入了com.gargoylesoftware.htmlunit.html(否则,您的 HtmlTable 返回类型声明将不起作用),您的 instanceof 中不需要 com.gargoylesoftware.htmlunit.html.HtmlTable查看。只需 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;
}

关于java - 为什么代码在 "return"之后仍在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31101960/

相关文章:

list - 递归如何满足基本情况 Haskell

c - 使用分治法获得数组的第二大元素

java - 我应该如何使用递归递增数字?

java - 如何使用 url 模式查找 servlet 类名?

takePersistableUriPermission() (SAF) 上的 java.lang.SecurityException

java - 是否可以将 MIRTH 与 Apache Camel 集成?

java - 使用 Object 字段序列化类的方法?

algorithm - 递归方程

java - Java 中的递归和链表

java - 保留特殊订单/按 map 排序