我正在执行此操作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中是否有更简洁的方法。
答案 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();
}
}
您还可以在该方法中执行其他操作,例如检查文本是否为空或是否有效。
当然,如果你只获得一次特定元素的文本,这可能是不切实际的,但这是我所建议的。就个人而言,我也认为这比其他答案中提出的三元运算符解决方案更整洁,更简洁。