【发布时间】:2012-09-05 11:41:09
【问题描述】:
我正在使用托管在 Windows Azure 上的 Spring 3 MVC 服务器,并使用它为用户提供通过 Web 浏览器和 Android 设备进行的交互。所有代码都是用 Java 编写的。
当我通过浏览器与服务器交互时,一切正常,当使用 Android 与它交互时,如果服务器作为 localhost 运行,它就可以正常工作。但是,当我使用 Android 客户端与 Azure 托管服务器交互时,我随机(但总是最终)得到一个 NullPointerException,因此有时代码运行良好但最终会出现。我得到NullPointer 更改的确切位置,但它总是在使用RestTemplate 的HTTP 调用期间。
另一个奇怪的事情是,在调试中运行 Android 应用程序时,代码将运行到代码中的某个任意点(仍然在 RestTemplate 调用时崩溃),但 NullPointerException 的堆栈跟踪将指向之前打的电话。
我调用的一般代码类似于以下内容:
private class ChangeDirectory extends AsyncTask< String, Void, Boolean >
{
@Override
protected Boolean doInBackground(String... directoryName) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add( new StringHttpMessageConverter() );
String url = "http://" + Constants.DNS +"/ui/android/cloud/change_directory";
restTemplate.put(url,
directoryName[0]);
return true;
}
}
堆栈跟踪看起来像:
09-05 11:32:05.081: E/AndroidRuntime(535): Caused by: java.lang.NullPointerException
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.http.client.SimpleClientHttpResponse.getStatusCode(SimpleClientHttpResponse.java:62)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:46)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:476)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:438)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.RestTemplate.put(RestTemplate.java:364)
09-05 11:32:05.081: E/AndroidRuntime(535): at com.artmaps.im.activity.HomeActivity$ChangeDirectory.doInBackground(HomeActivity.java:192)
09-05 11:32:05.081: E/AndroidRuntime(535): at com.artmaps.im.activity.HomeActivity$ChangeDirectory.doInBackground(HomeActivity.java:1)
09-05 11:32:05.081: E/AndroidRuntime(535): at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-05 11:32:05.081: E/AndroidRuntime(535): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-05 11:32:05.081: E/AndroidRuntime(535): ... 5 more
指向restTemplate.put(url, directoryName[0]);调用
我尝试在服务器端放入语句,当这些NullPointers 被抛出时,服务器似乎没有收到请求,因为没有到达语句。
对于NullPointerException 的原因的任何帮助将不胜感激,因为我对此感到很困惑,尤其是有时它有效,有时却无效
编辑: 根据https://jira.springsource.org/browse/ANDROID-102
这有点帮助,但仍然不能解释为什么它有时会起作用,并且只会在与基于 Azure 的服务器交互时失败
【问题讨论】:
标签: android spring azure nullpointerexception resttemplate