【问题标题】:Looping through parsed JSON to find a string match (Caused by: java.lang.NegativeArraySizeException: -1)遍历解析的 JSON 以查找字符串匹配项(原因:java.lang.NegativeArraySizeException:-1)
【发布时间】:2015-04-08 08:06:37
【问题描述】:

我正在创建一个应用程序,用户在其中将名称放入 EditText。然后在循环中使用此文本来查看解析的 JSON 数据中是否有任何匹配项。如果有匹配项,则匹配项将添加到 ArrayList。然后将该数组列表调整为列表视图。

private void handleJsonNameResponse() {

    if (mNameArray == null) {
        // TODO: handle error
    } else {
        try {
            ArrayList<HashMap<String, String>> namePosts = new ArrayList<HashMap<String, String>>();

            HashMap<String , String> namesAndCreatedHash =  new HashMap<String, String>();

            for (int i = 0; i < mNameArray.length(); i++) {
                JSONObject namePost = mNameArray.getJSONObject(i);
                String name = namePost.getString(KEY_CONTENT);
                name = Html.fromHtml(name).toString();
                String created = namePost.getString(KEY_CREATED_AT);
                created = Html.fromHtml(created).toString();

                if ( name == mName ) {

                    namesAndCreatedHash.put(KEY_CONTENT, name);
                    namesAndCreatedHash.put(KEY_CREATED_AT, created);

                    namePosts.add(namesAndCreatedHash);

                }


            }

            String[] keys = { KEY_CONTENT , KEY_CREATED_AT};
            int[] ids = {android.R.id.text1 , android.R.id.text2};

            SimpleAdapter adapter = new SimpleAdapter(NameListActivity.this , namePosts, android.R.layout.simple_list_item_2,
                    keys ,ids);
            setListAdapter(adapter);


            }catch(JSONException e){
                e.printStackTrace();
            }

        }
    }

我看不出我做错了什么,但我不断收到此错误原因:java.lang.NegativeArraySizeException: -1

这是完整的代码

public class NameListActivity extends ListActivity {

private String mName;

public static final String TAG = NameListActivity.class.getSimpleName();

private JSONArray mNameArray;

private final String KEY_CONTENT = "content";
private final String KEY_CREATED_AT = "created_at";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_name_list);

    Intent intent = getIntent();
    mName = intent.getStringExtra("name");

    if (networkIsON()) {
        GetNameData getNameData = new GetNameData();
        getNameData.execute();
    } else {

    }


}


private void handleJsonNameResponse() {

    if (mNameArray == null) {
        // TODO: handle error
    } else {
        try {
            ArrayList<HashMap<String, String>> namePosts = new ArrayList<HashMap<String, String>>();

            HashMap<String , String> namesAndCreatedHash =  new HashMap<String, String>();

            for (int i = 0; i < mNameArray.length(); i++) {
                JSONObject namePost = mNameArray.getJSONObject(i);
                String name = namePost.getString(KEY_CONTENT);
                name = Html.fromHtml(name).toString();
                String created = namePost.getString(KEY_CREATED_AT);
                created = Html.fromHtml(created).toString();

                if ( name == mName ) {

                    namesAndCreatedHash.put(KEY_CONTENT, name);
                    namesAndCreatedHash.put(KEY_CREATED_AT, created);

                    namePosts.add(namesAndCreatedHash);

                }

            }

            String[] keys = { KEY_CONTENT , KEY_CREATED_AT};
            int[] ids = {android.R.id.text1 , android.R.id.text2};

            SimpleAdapter adapter = new SimpleAdapter(NameListActivity.this , namePosts, android.R.layout.simple_list_item_2,
                    keys ,ids);
            setListAdapter(adapter);


            }catch(JSONException e){
                e.printStackTrace();
            }

        }
    }


private boolean networkIsON() {
    boolean isOn = false;
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        isOn = true;
    }
    return isOn;
}


private class GetNameData extends AsyncTask< Object , Void , JSONArray> {

    @Override
    protected JSONArray doInBackground(Object... objects) {
        int responseCode = -1;

        JSONArray jsonResponse =  null;

        try {
            URL nameUrl = new URL("https://fast-lowlands-9315.herokuapp.com/posts.json");
            HttpURLConnection connection = (HttpURLConnection) nameUrl.openConnection();
            connection.connect();

            responseCode = connection.getResponseCode();
            Log.v(TAG , "" + responseCode);

            if (responseCode == 200 ) {

                InputStream inputStream = connection.getInputStream();
                Reader reader = new InputStreamReader(inputStream);
                int contentLength = connection.getContentLength();
                char[] charArray = new char[contentLength];
                reader.read(charArray);
                String responseData = new String(charArray);


                jsonResponse = new JSONArray(responseData);

            } else {
                Log.i(TAG , "unsuccessful HTTP response code" + responseCode);
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonResponse;
    }

    @Override
    protected void onPostExecute(JSONArray result) {

        mNameArray = result;
        handleJsonNameResponse();
    }
}

}

这是我在 logcat 中遇到的错误

02-08 09:38:15.190  27892-27979/com.androidy.listactivity E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.androidy.listactivity, PID: 27892
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.lang.NegativeArraySizeException: -1
        at com.androidy.listactivity.NameListActivity$GetNameData.doInBackground(NameListActivity.java:142)
        at    com.androidy.listactivity.NameListActivity$GetNameData.doInBackground(NameListActivity.java:121)

【问题讨论】:

    标签: java android arrays json sorting


    【解决方案1】:

    在这个sn-p中,

     int contentLength = connection.getContentLength();
     char[] charArray = new char[contentLength];
     reader.read(charArray);
     String responseData = new String(charArray);
    

    您正在使用内容长度的返回值来分配一个字节数组,在您的情况下它返回-1,导致异常。一个可能的解决方法:

     StringBuilder builder = new StringBuilder();
     byte[] array = new byte[8092];
     int read = 0;
    
     while ((read = inputStream.read(array)) != -1) {
           builder.append(new String(array, 0, read));
     }
    
    jsonResponse = new JSONArray(builder.toString());
    

    【讨论】:

    • StringBuilder builder = new StringBuilder();字节[]数组=新字节[8092];整数读取 = 0; while ((read = is.read(array)) != -1) { builder.append(new String(array, 0, read)); } jsonResponse = new JSONArray(builder.toString());
    • “是”。现在给我一个问题...它说无法解析符号是
    • is 它是InputStream
    • stackoverflow.com/questions/28400522/… 很抱歉打扰您,但我是新手,已经为此工作了好几天...您发现我的代码有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多