我正在开发一个通过HTTP调用RESTful服务器的Android应用程序。问题是,我收到以下错误: NegativeArraySizeException -1
。我无法弄清楚问题发生的原因。
我有两个课程:ReadHttpTask
和HttpHelper
。该错误似乎是由HttpHelper类中的StringBuilder引起的,或者至少是调试器显示异常原因的地方。
ReadHttpTask:
public class ReadHttpTask extends AsyncTask<String, Void, CharSequence> {
@Override
protected CharSequence doInBackground(String...urls) {
String urlString = urls[0];
try{
CharSequence result = HttpHelper.GetHttpResponse(urlString);
return result;
} catch (IOException ex){
cancel(true);
String errorMessage = ex.getMessage() + "\n" + urlString;
Log.e("Something went wrong", errorMessage);
return errorMessage;
}
}
}
HttpHelper:
public class HttpHelper {
public static CharSequence GetHttpResponse(String urlString) throws IOException {
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
if(!(connection instanceof HttpURLConnection)){
throw new IOException("Not an HTTP connection");
}
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = httpConnection.getResponseCode();
if(responseCode != HttpURLConnection.HTTP_OK){
String responseMessage = httpConnection.getResponseMessage();
throw new IOException("HTTP response code: " + responseCode + " " + responseMessage);
}
InputStream inputStream = httpConnection.getInputStream();
BufferedReader reader = null;
try{
reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder result = new StringBuilder(httpConnection.getContentLength());
while(true){
String line = reader.readLine();
if(line==null) break;
result.append(line);
}
return result;
} finally {
if(reader != null) reader.close();
}
}
}
答案 0 :(得分:2)
使用getContentLength
中的URLConnection
方法创建StringBuilder的实例。
首先,让我们看看StringBuilder:
StringBuilder public StringBuilder(int capacity)
构造一个字符串生成器,其中没有字符和初始值 capacity参数指定的容量。参数:容量 - 初始能力。 抛出:NegativeArraySizeException - 如果容量 参数小于0.
如果您打开文档,您会看到:
返回
int此连接的URL的资源的内容长度 引用, -1,如果内容长度未知,或者内容 长度大于Integer.MAX_VALUE。
所以你有自己的解决方案。如果您为-1,则不应创建具有特定大小的StringBuilder,如果您收到值即可。如果没有,让SB管理自己的大小。
像这样创建StringBuilder:
StringBuilder result = new StringBuilder(); //create with a size of 16 character.
答案 1 :(得分:0)
我也面临着类似的例外。当表/视图/过程不存在于DB中时抛出此错误。我从构造函数注入中注入程序包名称和过程名称,并尝试编译simplejdbccall,因为过程不存在,因此引发了相同的错误。