我发现我的代码在点击“返回表”后仍在运行; (我已经运行了调试模式并且它真的向前移动到下一行,为什么一旦调用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
答案 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;
}