2014-03-29 32 views
0

我正在尝试将推文的纬度和经度存储在JSON对象中。当我只使用地理位置时,它工作正常。Twitter4J - 使用getLatitude()时出现空指针异常

ex。 obj.put("coordinates", tweet.getGeoLocation());

当我改变它只得到纬度或经度抛出一个空指针异常。

ex。 obj.put("lat", tweet.getGeoLocation().getLatitude());

代码:

JSONArray array = new JSONArray(); 
try { 
     Query query = new Query("query"); 
     QueryResult result; 
     result = twitter.search(query); 
     tweets = result.getTweets(); 

    for (Status tweet : tweets) { 

     JSONObject obj = new JSONObject(); 

     obj.put("userName", tweet.getUser().getScreenName()); 
     obj.put("text", tweet.getText()); 
     obj.put("lat", tweet.getGeoLocation().getLatitude()); 
     obj.put("lon", tweet.getGeoLocation().getLongitude()); 

     String json = obj.toString(); 
     array.put(obj); 

    } 
    System.out.println(array); 
} 
catch (TwitterException te) { 
    te.printStackTrace(); 
    System.out.println("Failed to search tweets: " + te.getMessage()); 
    System.exit(-1); 
    } 
    return array; 
} 

这是错误:

SEVERE: Servlet.service() for servlet [Jersey REST Service] in context with path [/Jersey] threw exception java.lang.NullPointerException

更新:这似乎是现在的一半工作,它实际上得到的经度和纬度了,但有仍然是一个错误。 这里是输出日志。

Mar 29, 2014 8:24:25 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException 
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container 
java.lang.NullPointerException 
    at sample.hello.resources.TweetUsingTwitter4jExample.getTweets(TweetUsingTwitter4jExample.java:70) 
    at sample.hello.resources.HelloResource.sayHello(HelloResource.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) 
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715) 
    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:51) 
    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:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

Mar 29, 2014 8:24:25 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Jersey REST Service] in context with path [/Jersey] threw exception 
java.lang.NullPointerException 
    at sample.hello.resources.TweetUsingTwitter4jExample.getTweets(TweetUsingTwitter4jExample.java:70) 
    at sample.hello.resources.HelloResource.sayHello(HelloResource.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) 
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715) 
    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:51) 
    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:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
+0

好,可能只是地理位置元素本身为空。你有没有试图检查? – ylabidi

+0

是的,我已经检查过,它绝对不是空的。 – user3461851

+0

是否有关于异常的更多信息?日志或链接回代码的堆栈跟踪? – ylabidi

回答

0

我认为发生的事情是,对于一些你收获的tweet的地理位置元素是null。除非推文本身为空,否则没有别的可能抛出NullPointerException,似乎并不是这种情况,因为如果按原样存储GeoLocation元素,而没有提取经度和纬度,则不会发生异常。

此外,如果你检查的javadoc为getGeolocation()方法,你会发现,没有义务为鸣叫进行地理定位,因此,位置都不可能null

/** 
    * Returns The location that this tweet refers to if available. 
    * 
    * @return returns The location that this tweet refers to if available (can be null) 
    * @since Twitter4J 2.1.0 
    */ 
    GeoLocation getGeoLocation(); 

我D建议做下面的事情,看看它是否可以解决你的问题:

for (Status tweet : tweets) { 

    JSONObject obj = new JSONObject(); 

    obj.put("userName", tweet.getUser().getScreenName()); 
    obj.put("text", tweet.getText()); 
    final GeoLocation location = tweet.getGeolocation(); 
    if(location != null) { 
     obj.put("lat", location().getLatitude()); 
     obj.put("lon", location().getLongitude()); 
    } 
    String json = obj.toString(); 
    array.put(obj); 
} 
+0

谢谢。首先存储为GeoLocation并使用if语句。 – user3461851