如果定义了jsoup中的元素,则分配给变量的最简洁方法是什么?

时间:2015-12-29 09:26:19

标签: java nullpointerexception null jsoup

我正在执行此操作String name = doc.select("h1#name").first().text();并且我在一个页面上收到了NullPointerException,其中' h1#name'元素不存在。我正在解析DOM,抓住数百个元素。我似乎需要在分配之前测试每个元素,因此我将其更改为:

String name = null;

if( doc.select("h1#name").first() != null && doc.select("h1#name").first().text() != null ))
    name = doc.select("h1#name").first.text();

有更好的方法吗?我刚刚学习Java,我的背景是在Perl,在那里我做了类似的事情:

my $name = $doc->select("h1#name")->text if $doc->select("h1#name");

这不是什么大问题,因为我的代码对我有用。我只是想知道在Java中是否有更简洁的方法。

2 个答案:

答案 0 :(得分:2)

您不会通过检查您所访问的所有对象来访问所需的值。

要将perl语法翻译成java,我会使用ternary operator

name = doc.select("h1#name").first() != null ? 
            doc.select("h1#name").first().text() : null

除非您的名称中包含非空值,并且您不想使用null覆盖它,否则无需检查doc.select("h1#name).first().text() != null

答案 1 :(得分:1)

我建议使用一种实用方法,如下所示:

(click)

然后,您可以消除大量的样板和重复,因此您的代码变为:

Document mDocument;

(...)

String getElementTextOrNull (String cssQuery) {
    Element e = mDocument.select(cssQuery).first();

    if (e == null) {
        return null;
    } else {
        return e.text();
    }
}

您还可以在该方法中执行其他操作,例如检查文本是否为空或是否有效。

当然,如果你只获得一次特定元素的文本,这可能是不切实际的,但这是我所建议的。就个人而言,我也认为这比其他答案中提出的三元运算符解决方案更整洁,更简洁。