调用XPathExpression evaluate()方法抛出NullPointerException

时间:2017-09-13 10:56:39

标签: java xml xpath nullpointerexception

我正在学习如何使用java XPath API,我对XPathExpression类的evaluate()方法的行为提出了疑问。

我的XML文件包含员工数据 我希望以String的形式找到收入最高的员工,所以我写下这段代码:

FileInputStream file = new FileInputStream(new File
("D:\\workspace\\NetCrackerTasks\\src\\ru\\ncedu\\java\\tasks\\emp.xml"));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document src = builder.parse(file);
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/content/emp/employee[not(../employee/sal > xs:decimal(sal))]";
String result = null;
XPathExpression expr = null;
try {
    expr = xPath.compile(expression);
    result = expr.evaluate(src); //This throws NullPointerException
} catch (XPathExpressionException e) {
    e.printStackTrace();
}
return result;

当我在Eclipse中运行此代码时,expr.evaluate(src)会抛出NullPointerException。 在docs.oracle.com(link)的文档中,它说的是

  

如果source为null,则抛出NullPointerException。

我检查了我的src对象,它不是null,xml文档的路径是正确的。

所以我的问题是:为什么我会得到NullPointerException? 并没有更合适的方法来获取符合XPath表达式的String形式的XML文档元素吗?
我的XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<content 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="ns:emp"
    xsi:schemaLocation="ns:emp emp.xsd">
    <emp>
        <employee deptno="10" empno="7369" mgr="7902">
            <ename>SMITH</ename>
            <job>CLERK</job>
            <hiredate>1980-12-17</hiredate>
            <sal>800.00</sal>
            <comm>0.0</comm>
        </employee>
        <employee deptno="30" empno="7521" mgr="7698">
            <ename>WARD</ename>
            <job>SALESMAN</job>
            <hiredate>1981-02-22</hiredate>
            <sal>1250.00</sal>
            <comm>500.00</comm>
        </employee>
        <employee deptno="20" empno="7566" mgr="7839">
            <ename>JONES</ename>
            <job>MANAGER</job>
            <hiredate>1981-04-02</hiredate>
            <sal>2975.00</sal>
            <comm>0.0</comm>
    </emp>
</content>


编辑:当xPath.compile(expression);运行时,expr不返回null,expr.evaluate(src)不为空。因此抛出NullPointerException不是因为在null对象上调用方法,因为object不为null。

0 个答案:

没有答案