我发现我的代码在点击“返回表”后仍在运行; (我已经运行了调试模式,它确实前进到了下一行,怎么走?一旦调用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 最佳答案 找到时,您需要停止搜索,但是您并没有停止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;}(如果代码所调用的内容不再抛出异常,请删除throws Exception。)另外请注意,由于您显然是在导入com.gargoylesoftware.htmlunit.html(否则,您的HtmlTable返回类型声明将无效),因此不需要在您的com.gargoylesoftware.htmlunit.html.HtmlTable检查中。您只需要instanceof。如果您需要一个找不到时抛出的版本,则它必须是包装函数。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 - 为什么代码在“返回”后仍在运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31101960/ 10-13 03:24