关注HtmlPage对象没有清理

时间:2014-03-23 11:17:23

标签: java memory-management exception-handling htmlunit

在这个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());
}

2 个答案:

答案 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时,页面还没有加载。