尝试在空对象引用[dup]

时间:2017-03-23 15:27:51

标签: android nullpointerexception

我试图获得两点之间的距离

这是错误

  

java.lang.NullPointerException:尝试调用虚方法'int   空对象引用上的java.lang.String.length()'                         在com.example.android.algorithm.MainActivity.distancematrix(MainActivity.java:209)                         at com.example.android.algorithm.MainActivity $ 1.onClick(MainActivity.java:92)                         在android.view.View.performClick(View.java:5207)                         在android.view.View $ PerformClick.run(View.java:21177)                         在android.os.Handler.handleCallback(Handler.java:739)                         在android.os.Handler.dispatchMessage(Handler.java:95)                         在android.os.Looper.loop(Looper.java:148)                         在android.app.ActivityThread.main(ActivityThread.java:5441)                         at java.lang.reflect.Method.invoke(Native Method)                         在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:738)                         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

这是导致错误的代码部分

public  void distancematrix()
     {
         String k="str";
         double lat1,lat2,lng1,lng2;
         for(int i=0;i<5;i++) {
             lat1=givenlatlng[i][0];
             lng1=givenlatlng[i][1];

             for (int j = 0; j < 5; j++) {
                 lat2=givenlatlng[j][0];
                 lng2=givenlatlng[j][1];
                 k=getDistance(lat1,lng1,lat2,lng2);
                 DistanceMatrix[i][j] = Double.parseDouble(k.substring(0,k.length()-2));
             }

         }

     }

givenlatlang包含纬度&amp;经度

getDistance函数

public String getDistance(final double lat1, final double lon1, final double lat2, final double lon2){
        final String[] parsedDistance = new String[1];
        final String[] response = new String[1];
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    URL url = new URL("http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2 + "&sensor=false&units=metric&mode=driving");
                    final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("POST");
                    InputStream in = new BufferedInputStream(conn.getInputStream());
                    response[0] = org.apache.commons.io.IOUtils.toString(in, "UTF-8");

                    JSONObject jsonObject = new JSONObject(response[0]);
                    JSONArray array = jsonObject.getJSONArray("routes");
                    JSONObject routes = array.getJSONObject(0);
                    JSONArray legs = routes.getJSONArray("legs");
                    JSONObject steps = legs.getJSONObject(0);
                    JSONObject distance = steps.getJSONObject("distance");
                    parsedDistance[0] =distance.getString("text");

                } catch (ProtocolException e) {
                    e.printStackTrace();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {``
            e.printStackTrace();
        }
        return parsedDistance[0];
    }
}`

1 个答案:

答案 0 :(得分:1)

基本上,您尝试强制异步操作​​变为同步,即在<!DOCTYPE html> <html lang="en"> <head> </head> <body> <div> &#191Do you like Futball&#63<br> <input type="radio" name="like" value="Ly" id="yes" onclick="show(1);" checked> Yes<br> <input type="radio" name="like" value="Ln" id="no" onclick="show(2); " > No<br> </div> <div id="teams"> teams </div> <div id="activity" style="display: none;"> activity </div> <script> function show(x){ if(x==1){ document.getElementById("teams").style.display ="block"; document.getElementById("activity").style.display ="none"; }else{ if(x==2){ document.getElementById("teams").style.display ="none"; document.getElementById("activity").style.display ="block"; } } } </script> </body> </html> 循环的中间发出Web请求并尝试将其锁定到UI线程上。最重要的是,您的错误处理很差,因此如果调用任何for语句,则会返回默认值catch(即{{1} }})。太可能出错了。

首先,我建议调查AsyncTask以执行网络操作。您可以对请求进行排队,让它们逐个处理,然后在完成后显示结果,并且还可以减缓UI线程的速度。

您还需要在请求之间添加延迟。我在调试代码时遇到的一个问题是在12次请求后达到了查询速率限制。看看是否有一种限制API调用的方法。

考虑到所有这些因素,以下是我如何重构您的代码:

parsedDistance[1]

可以使用null

执行