【问题标题】:How to debug NullPointerException at apache.jena.queryExecutionFactory during create?如何在创建期间在 apache.jena.queryExecutionFactory 调试 NullPointerException?
【发布时间】:2019-02-27 12:10:36
【问题描述】:

我正在与org.apache.jenakaraf 一起工作。在尝试查询我的模型时,我得到了一个NullPointerException,我打印了用于创建查询的所有变量,并且所有(queryStringinferedModel)都不是null。 这是我的代码的样子:

Model model = JenaEngine.readModel(inputDataOntology);
if (model == null) {
    return "model null !";
}
Model inferedModel = JenaEngine.readInferencedModelFromRuleFile(model, inputRule);
if (inferedModel == null) {
    return "inferedModel null !";
}
JenaEngine.updateValueOfDataTypeProperty(inferedModel, ns, "Peter", "age", 10);
JenaEngine.updateValueOfObjectProperty(inferedModel, ns, "Peter", "estFilsDe", "Femme1");
JenaEngine.createInstanceOfClass(model, ns, "Femme", "abc");
//query on the model
String prefixQuery = "PREFIX ns: <http://www.owl-ontologies.com/Ontology1291196007.owl#>\n" +
    "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
    "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"+
    "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n";
String selectQuery = "SELECT ?user ?age WHERE {\n ?user ns:age ?age.\n }";
QueryExecution queryExecution = QueryExecutionFactory.create(prefixQuery+selectQuery, inferedModel);
ResultSet rs = queryExecution.execSelect();
List<String> users = new ArrayList();
while(rs.hasNext()) {
    QuerySolution qs = rs.next();
    Resource user = qs.getResource("user");
    users.add(user.getLocalName());
}
String results = "";
for(String user : users) {
    results+=user+" ";
}
return results;

我在初始化QueryExecution 变量的那一行得到一个NullPointerException

这是错误的堆栈跟踪:

java.lang.NullPointerException
        at org.apache.jena.query.ARQ.isTrue(ARQ.java:650)
        at org.apache.jena.sparql.lang.ParserBase.<init>(ParserBase.java:292)
        at org.apache.jena.sparql.lang.SPARQLParserBase.<init>(SPARQLParserBase.java:43)
        at org.apache.jena.sparql.lang.sparql_11.SPARQLParser11Base.<init>(SPARQLParser11Base.java:22)
        at org.apache.jena.sparql.lang.sparql_11.SPARQLParser11.<init>(SPARQLParser11.java:4974)
        at org.apache.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:91)
        at org.apache.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:52)
        at org.apache.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:34)
        at org.apache.jena.query.QueryFactory.parse(QueryFactory.java:147)
        at org.apache.jena.query.QueryFactory.create(QueryFactory.java:79)
        at org.apache.jena.query.QueryFactory.create(QueryFactory.java:52)
        at org.apache.jena.query.QueryFactory.create(QueryFactory.java:40)
        at fr.conceptit.tuto.web.Main.work(Main.java:71)
        ...

我正在通过 Karaf 部署我的应用程序,问题可能来自那里。这是我在 Karaf 上的捆绑包列表的屏幕截图。请注意,我添加了所有 Jena 罐子。Karaf Bundles list

【问题讨论】:

  • 所以它发生在QueryExecutionFactory.create 内部?捕获异常并打印堆栈跟踪
  • @JoakimDanielson 确实发生在 QueryExecutionFactory.create 内部。我添加了堆栈跟踪以获取更多信息
  • NPE on ARQ.isTrue :ARQ 未正确初始化;但我不明白为什么不正确。你运行的是哪个版本? (1) 你有没有重新打包过代码? (2) 如果没有,请尝试在有任何呼叫 Jena 之前添加JenaSystem.init()
  • @AndyS 我不明白你重新打包我使用mvn clean install 的代码是什么意思,你的意思是我必须使用mvn package?我添加了JenaSystem.init() 并没有做得更好,仍然有相同的 NPE。也可能我不够清楚,但我正在使用 Karaf。我给了所有我要添加捆绑包的屏幕截图的耶拿罐子,也许问题出在那儿。

标签: java nullpointerexception jena karaf


【解决方案1】:

感谢@AndyS 的评论,我能够找到一种方法来让它发挥作用。他指着正确的方向说:

ARQ.isTrue 上的 NPE:ARQ 未正确初始化

确实是问题所在,我通过初始化ARQ 而不是他建议的JenaSystem 解决了这个问题。基本上我在对Jena 进行任何调用之前添加了org.apache.jena.query.ARQ.init(),并且它起作用了。 再次感谢您的帮助和支持。

【讨论】:

  • JenaEngine 不是耶拿的一部分。
  • JenaSystem.init() 是正确的调用而不是 ARQ.init 但两者都应该工作。
  • @AndyS 你说得对,这是一个错字我的意思是JenaSystem 而不是JenaEngine 我编辑了我的答案。我也试过JenaSystem.init() 对我不起作用。也许是因为我在 OSGI 中使用了Jena。再次感谢您的英特尔,它帮助我解决了我的问题。
  • 谢谢。 org.apache.jena.query.ARQ.init() 也为我工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2011-10-24
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多