在这个HtmlUnit的例子中,我已经清理了HtmlPage,我仍然在main方法中获取指定url的锚点,因为我在这段代码中想到的是首先计算return语句然后最后调用的是然后上面的计算页面从getPageResource()方法返回,或者如果您认为不是这样请分享。
但在我的脑海中还有一个问题是,如果对象被“页面”引用清理,那么它将从它获得getAnchors。
public HtmlPage getPageResource() {
WebClient webClient = new WebClient();
HtmlPage page = null;
try {
page = webClient.getPage("http://some-url.com");
// Do something with page
return page;
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
return page;
} catch (MalformedURLException e) {
e.printStackTrace();
return page;
} catch (IOException e) {
e.printStackTrace();
return page;
} finally {
if (page != null)
page.cleanUp();
}
}
public static void main(String args[]) {
HtmlUnitExample htmlUnitExample = new HtmlUnitExample();
HtmlPage page = htmlUnitExample.getPageResource();
System.out.println(page.getAnchors());
}
答案 0 :(得分:0)
我对此代码有一些评论。
首先,如果getPage
抛出任何异常,那么page
变量将为null
,而如果它没有分配对象。因此,在Do something with page
行中,您完全确定page
不是null
。所以你应该把你的代码放在那里。这包括cleanUp
。
此外,当检测到异常时,您返回null
对象,然后尝试从getAnchors
对象null
。这将导致NullPointerException
方法中出现main
。
你最有可能找到这样的东西:
public HtmlPage getPageResource() throws Exception {
WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage("http://some-url.com");
// Do something with page
page.cleanUp();
return page;
}
public static void main(String args[]) {
HtmlUnitExample htmlUnitExample = new HtmlUnitExample();
try {
HtmlPage page = htmlUnitExample.getPageResource();
System.out.println(page.getAnchors());
} catch (Exception e) {
e.printStackTrace();
}
}
正如您所看到的,代码更简单,并且没有if
语句。最有可能的是,整个getPageResource()
方法应该被移除,或者可能不是返回页面,而是返回锚点列表(锚点或空格),这样您就可以完全相信您的List
{ {1}}并且您不需要在那里进行任何异常处理。
那是关于Java的。转到HtmlUnit,我从来不需要使用main
。完全相同的JavaDocs状态cleanUp
所以,显而易见的问题是你想用它做什么?。如果您想准备好使用该对象获取新页面,请记住不需要清理页面。
答案 1 :(得分:-1)
为什么不尝试将页面设置为null而不是为了内存问题清理它?或者,我建议您添加' Thread.sleep(10 * 1000);'在声明之后' //对页面执行某些操作,因为页面的加载是异步的。我想当你触发cleanUp时,页面还没有加载。