NegativeArraySizeException -1

时间:2016-09-30 11:34:45

标签: java android rest

我正在开发一个通过HTTP调用RESTful服务器的Android应用程序。问题是,我收到以下错误: NegativeArraySizeException -1 。我无法弄清楚问题发生的原因。

我有两个课程:ReadHttpTaskHttpHelper。该错误似乎是由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();
        }
    }
}

2 个答案:

答案 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,因为过程不存在,因此引发了相同的错误。