gpt4 book ai didi

java - 如何在 Java 中使用 Jena API 处理查询的空结果

转载 作者:行者123 更新时间:2023-12-01 12:53:38 25 4
gpt4 key购买 nike

我正在使用 Jena API。一切都对我来说很好,除非在本体模型中找不到查询匹配(即查询结果为空)。然后使用servlet在浏览器中不显示任何内容,并且在控制台上显示空指针异常。即下面给出的。谁能指导我如何处理这个空指针异常?谢谢。

Jun 04, 2014 3:37:22 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [main.DevInsta] in context with path [/FMOnt] threw exception
java.lang.NullPointerException
at main.DevInsta.doGet(DevInsta.java:71)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

最佳答案

初始解决方案

在回答此问题时,未发布此问题中使用的查询字符串,也未发布 NullPointerException 周围使用的代码。发生。这是协助解答的第一步。

我通常的来源NullPointerException当使用 QueryExecution 时来自两个地方之一:

聚合

如果您的查询使用GROUP BY x ,但您的数据没有将任何内容绑定(bind)到 x ,您最终可以得到 ResultSet看起来像下面这样:

---------------
| ?x | ?y |
---------------
| | |
---------------

你可以获得意想不到的true结果来自hasNext() ,然后是后续的 NullPointerException当尝试检索元素时。对于聚合查询,解决方案是测试第一个结果的预期绑定(bind)是否包含任何 null值也是如此。

可选

如果您的查询包含可选 block ,那么它可能不会绑定(bind)到特定的解决方案,您需要对其进行测试:

SELECT ?x ?y {
?x rdf:type urn:ExampleClass .
OPTIONAL { ?x urn:p ?y }
}

当您迭代 QuerySolution 时对象,获取变量返回的值可能是 null ,并且您需要在代码中考虑到它。

网络服务帮助

如果你的 ResultSet 我建议你做一件事不是很大,就是用一个ResultSetRewindable (由ResultSetFactory.copyResults提供)。在您的 Web 应用程序中,如果您使用合适的日志记录库,您可以测试类似 logger.isDebugEnabled() 的内容。 。如果是,您可以使用 ResultSetFormatter 打印查询的诊断值。当试图理解为什么查询的呈现会给您带来意想不到的结果时,这可能极其有用:

final QueryExecution exec = ...;
final ResultSetRewindable r = ResultSetFactory.copyResults(exec.execSelect());
exec.close();
// Assuming slf4j
if( logger.isDebugEnabled() ) {
final ByteArrayOutputStream results = new ByteArrayOutputStream();
ResultSetFactory.out(results,r);
r.reset();
logger.debug("Rendering query solution:\n{}", results);
}
// Continue on like you normally would

如果您一般不想这样做(可能 doGet 调用得太频繁和/或您的结果太大和/或这是一个很少发生错误的复杂系统),那么您可以总是放一个 try{..}catch(..){..} - 阻止发生异常的位置,并且仅在触发此特定异常时打印结果的副本。

关于java - 如何在 Java 中使用 Jena API 处理查询的空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24039576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com