我正在使用Jena API。除了在本体模型中找不到查询匹配(即Query的结果为null)之外,每件事都可以正常工作。然后在浏览器中使用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)
答案 0 :(得分:1)
初始解决方案
在此回答时,此问题中使用的查询字符串未发布,也未在NullPointerException
出现的位置使用的代码。这是第一步协助答案。
使用NullPointerException
时,QueryExecution
的常用来源来自两个地方之一:
聚集体
如果您的查询使用的是GROUP BY x
,但您的数据未绑定到x
的任何内容,则最终会得到如下所示的ResultSet
:
---------------
| ?x | ?y |
---------------
| | |
---------------
您可以从true
获得意外的hasNext()
结果,然后在尝试检索元素时获得后续的NullPointerException
结果。对于聚合查询,解决方案是测试第一个结果的预期绑定是否也包含任何null
值。
可选
如果您的查询包含一个可选块,那么它可能不会受特定解决方案的约束,您需要对其进行测试:
SELECT ?x ?y {
?x rdf:type urn:ExampleClass .
OPTIONAL { ?x urn:p ?y }
}
当您对QuerySolution
个对象进行迭代时,获取变量返回的值可能为null
,您需要在代码中对其进行说明。
WebService帮助
如果您的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(..){..}
- 块,并且只在触发此特定异常时打印结果的副本。