0

I'm learning how to use java XPath API and I got a question about behavior of evaluate() method of XPathExpression class.

I have XML file that contains data about employees.
I want to find highest payed employee in form of String, so I write this code:

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;

When I run this code in Eclipse, expr.evaluate(src) throws NullPointerException. In documentation on docs.oracle.com(link) it says that

If source is null, then a NullPointerException is thrown.

I checked my src object and it is not null, and path to xml document is right.

So my question is: why do I get NullPointerException?
And isn't there more proper way to get elements of XML document in form of a String that match XPath expression?
My XML file looks like this:

<?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>


EDIT: xPath.compile(expression); does not return null and expr is not null when expr.evaluate(src) runs. So NullPointerException is thrown not becuase calling a method on a null object, because object is not null.

IAKulaga
  • 1
  • 1
  • Obviously the `expr = xPath.compile(expression);` returns you a **null** object. So rather look into when that compile method returns null. – GhostCat Sep 13 '17 at 11:10
  • Can You please explain what exactly is null there? It seems that `expr` is not null when `expr.evaluate(src);` runs. Also in compile() documentation it says that is returns compiled XPath expression. Why is it null? – IAKulaga Sep 13 '17 at 11:20
  • Have you read and digested that duplicated question? It all starts with - which object exactly is null. Then you work backwards from there. Please understand: this is really a super basic problem. We don't debug that for you. We explain to you how *you* enable yourself to solve the puzzle. – GhostCat Sep 13 '17 at 12:14

0 Answers0