我试图获得两点之间的距离
这是错误
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];
}
}`
答案 0 :(得分:1)
基本上,您尝试强制异步操作变为同步,即在<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div>
¿Do you like Futball?<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