簡體   English   中英

BufferedReader / AsynchTask- java.lang.NullPointerException:鎖== null

[英]BufferedReader / AsynchTask- java.lang.NullPointerException: lock == null

我正在使用Android應用程序,但遇到錯誤。 我正在嘗試與服務器通信並從該服務器獲取JSON對象。 我制作了一個名為ServerCommunication的類,該類擴展了AsynchTask。 我的服務器通信類具有標准的doInBackground()方法。 在此方法中,我嘗試從網頁中解析JSON對象,但是該方法中引發了異常。

我應該提到我現在在機器上本地運行服務器。 因此,傳遞我的ServerCommunication的URL是: http://127.0.0.1:9000/getVehicle/2942 : http://127.0.0.1:9000/getVehicle/2942 : http://127.0.0.1:9000/getVehicle/2942 getVehicle/ http://127.0.0.1:9000/getVehicle/2942 該網頁包含JSON對象的純文本。 病在底部包括JSON對象。

例外是: java.lang.NullPointerException: lock == null 在第二次try-catch中拋出此異常。

導致此異常的行是:

BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);

這行有一個錯誤,因為我的InputStream is為null。 出於某種原因,這條線拋出一個異常,這就是為什么is空。 在這篇文章的結尾,我會包括我的日志輸出

    HttpResponse httpResponse = httpClient.execute(httpPost);

這是我的ServerCommunication類:

class ServerCommunication extends AsyncTask<String, Integer, JSONObject> {

    public ServerResponse delegate = null;
    public JSONObject jResult;

    // this is called whenever you call puhlishProgress(Integer), for example
    // when updating a progressbar when downloading stuff
    protected void onProgressUpdate(Integer... progress) {

    }

    // the onPostexecute method receives the return type of doInBackGround()
    protected void onPostExecute(JSONObject result) {
        delegate.processFinish(result);
    }

    @Override
    protected JSONObject doInBackground(String... params) {

        InputStream is = null;
        JSONObject jObj = null;
        String json = null;

        Log.e("Params 0", params[0]);

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(params[0]);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;

            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }

            is.close();
            json = sb.toString();
            Log.e("JSON", json);

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        return jObj;
    }
}

這是我要解析的JSON對象:

{"Bus":[{"pkey":604,"vehicle_id":261,"trip_id":945162,"route_id":2942,"stop_id":1847,"latitude":43.26762008666992,"longitude":-79.9635009765625,"speed":3.0,"label":"504","bearing":110.0,"odometer":1329300.0,"timestamp":1420775313},{"pkey":605,"vehicle_id":284,"trip_id":945024,"route_id":2942,"stop_id":1926,"latitude":43.22480010986328,"longitude":-79.7864990234375,"speed":10.0,"label":"703","bearing":296.0,"odometer":9481600.0,"timestamp":1420775308},{"pkey":607,"vehicle_id":388,"trip_id":944939,"route_id":2942,"stop_id":1368,"latitude":43.247520446777344,"longitude":-79.84809875488281,"speed":12.0,"label":"1008","bearing":288.0,"odometer":2.21116E+7,"timestamp":1420775317},{"pkey":610,"vehicle_id":422,"trip_id":945158,"route_id":2942,"stop_id":2145,"latitude":43.2575798034668,"longitude":-79.92250061035156,"speed":0.0,"label":"1205","bearing":98.0,"odometer":203000.0,"timestamp":1420775296},{"pkey":623,"vehicle_id":402,"trip_id":945023,"route_id":2942,"stop_id":1955,"latitude":43.25736999511719,"longitude":-79.87146759033203,"speed":8.0,"label":"1102","bearing":286.0,"odometer":5067800.0,"timestamp":1420775311},{"pkey":630,"vehicle_id":276,"trip_id":945154,"route_id":2942,"stop_id":3089,"latitude":43.25257110595703,"longitude":-79.85984802246094,"speed":4.0,"label":"518","bearing":184.0,"odometer":5778500.0,"timestamp":1420775286},{"pkey":634,"vehicle_id":294,"trip_id":945161,"route_id":2942,"stop_id":1923,"latitude":43.23030090332031,"longitude":-79.79962158203125,"speed":13.0,"label":"713","bearing":110.0,"odometer":1.7729E+7,"timestamp":1420775313},{"pkey":639,"vehicle_id":335,"trip_id":944997,"route_id":2942,"stop_id":1320,"latitude":43.257320404052734,"longitude":-79.93509674072266,"speed":2.0,"label":"819","bearing":272.0,"odometer":4.09802E+7,"timestamp":1420775293},{"pkey":653,"vehicle_id":425,"trip_id":944985,"route_id":2942,"stop_id":2560,"latitude":43.23651885986328,"longitude":-79.97097778320312,"speed":13.0,"label":"1208","bearing":210.0,"odometer":5824800.0,"timestamp":1420775288},{"pkey":660,"vehicle_id":317,"trip_id":945168,"route_id":2942,"stop_id":2530,"latitude":43.20967102050781,"longitude":-79.78714752197266,"speed":0.0,"label":"801","bearing":272.0,"odometer":428900.0,"timestamp":1420775282}]}

日志輸出

01-09 00:05:29.053: W/System.err(21902): org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1:9000 refused
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:235)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:125)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.client.DefaultRequestDirector.executeOriginal(DefaultRequestDirector.java:1227)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:677)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:567)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:491)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:469)
01-09 00:05:29.053: W/System.err(21902):    at com.example.myshuttle.ServerCommunication.doInBackground(ServerCommunication.java:46)
01-09 00:05:29.053: W/System.err(21902):    at com.example.myshuttle.ServerCommunication.doInBackground(ServerCommunication.java:1)
01-09 00:05:29.053: W/System.err(21902):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-09 00:05:29.053: W/System.err(21902):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-09 00:05:29.053: W/System.err(21902):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-09 00:05:29.053: W/System.err(21902):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-09 00:05:29.053: W/System.err(21902):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-09 00:05:29.053: W/System.err(21902):    at java.lang.Thread.run(Thread.java:841)
01-09 00:05:29.053: W/System.err(21902): Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 9000): connect failed: ECONNREFUSED (Connection refused)
01-09 00:05:29.053: W/System.err(21902):    at libcore.io.IoBridge.connect(IoBridge.java:114)
01-09 00:05:29.053: W/System.err(21902):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-09 00:05:29.053: W/System.err(21902):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:460)
01-09 00:05:29.053: W/System.err(21902):    at java.net.Socket.connect(Socket.java:833)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
01-09 00:05:29.053: W/System.err(21902):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:188)
01-09 00:05:29.053: W/System.err(21902):    ... 15 more
01-09 00:05:29.053: W/System.err(21902): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
01-09 00:05:29.053: W/System.err(21902):    at libcore.io.Posix.connect(Native Method)
01-09 00:05:29.053: W/System.err(21902):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
01-09 00:05:29.053: W/System.err(21902):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-09 00:05:29.053: W/System.err(21902):    at libcore.io.IoBridge.connect(IoBridge.java:112)
01-09 00:05:29.053: W/System.err(21902):    ... 20 more

有什么建議么?

這里

sb.append(line +“ n”); <<<<<

BufferedReader讀取數據時,每行都添加n ,這會使json字符串無效。

只需在StringBuilder讀取並追加數據:

   while ((line = reader.readLine()) != null) {
        sb.append(line);
    }

又路過之前InputStreamInputStreamReader確保is不是null

我為WebService連接編寫了一個幫助程序類。 我認為您可以嘗試一下。

 public class ServiceHelper {
    /**
     * Get conten from url
     * 
     * @param url
     * @return
     */
    public static String getHttp(String url) {
        // Get the HTML response
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        HttpResponse response;
        try {
            response = client.execute(request);
            return parseStringFromResponse(response);
        } catch (Exception e) {

        }
        return "";
    }

    /**
     * Post content to url
     * 
     * @param url
     * @param params
     * @return
     */
    public static String postHttp(String url, List<NameValuePair> params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        try {
            // Add params if need
            if (params != null && !params.isEmpty()) {
                httppost.setEntity(new UrlEncodedFormEntity(params));
            }
            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
            return parseStringFromResponse(response);
        } catch (Exception e) {

        }
        return "";
    }

    /**
     * Parse string from {@link HttpResponse}
     * 
     * @param response
     * @return
     * @throws Exception
     */
    public static final String parseStringFromResponse(
            final HttpResponse response) throws Exception {
        InputStream in = response.getEntity().getContent();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(in));
        StringBuilder str = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            str.append(line);
        }
        in.close();
        return str.toString();
    }
}

所以我發現了我的問題:

我在端口9000的筆記本電腦上本地運行服務器。我可以使用localhost:9000訪問筆記本電腦上的服務器。

我在平板電腦上運行我的Android應用程序。 因此,當我的平板電腦嘗試訪問localhost:9000 ,我的平板電腦正在嘗試訪問自己的本地主機,而不是我的筆記本電腦。

要解決此錯誤,我必須通過平板電腦的網址是MyLaptopIP:9000 我還必須確保筆記本電腦和平板電腦位於同一網絡上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM