2015-05-13 54 views
0

我想單擊按鈕時從Url獲​​取json,但獲取空指針異常並且不幸應用程序停止這是我的onCreate方法。嘗試獲取json使用異步任務時發生java.lang.NullPointerException

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    autoCompView = (AutoCompleteTextView)findViewById(R.id.autocomplete_current); 

findViewById(R.id.shortestButton).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      getUrl();//calling getUrl method for getting Url 
     } 
    }); 

這是我的getUrl方法,用於創建url並從該url獲取json。

private void getUrl() { 
    String result = null; 
    String dest1 = list.get(0); 
    String dest2 = list.get(1); 
    String dest3 = list.get(2); 
    String start = getAddress(); 

     String urls = "https://maps.googleapis.com/maps/api/distancematrix/json?"; 
     try { 
      encodedString = urls + "origins=" 
        + URLEncoder.encode(start, "utf8")+"|" 
        + URLEncoder.encode(dest1, "utf8")+"|" 
        + URLEncoder.encode(dest2, "utf8")+"|" 
        + URLEncoder.encode(dest3, "utf8") 
        +"&destinations=" 
        + URLEncoder.encode(dest1, "utf8")+"|" 
        + URLEncoder.encode(dest2, "utf8")+"|" 
        + URLEncoder.encode(dest3, "utf8")+"|" 
        + URLEncoder.encode(start, "utf8") 
        +"&mode=driving" 
        +"&language = en-En" 
        +"&key="+API_KEY; 
      encodedString = encodedString.replaceAll("%2C","+"); 
      encodedString = encodedString.replaceAll("\\++", "+"); 

     } 

private class ConnectToUrlTask extends AsyncTask<String,Void,String> { 

    @Override 
    protected String doInBackground(String... uRl) { 
     String data = ""; 

      HttpConnections httpConnections = new HttpConnections(); 
     try { 
      data = httpConnections.readUrl(uRl[0]); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return data; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     new UrlTasks().execute(s); 
    } 
} 
private class UrlTasks extends AsyncTask<String,Void,String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String distance = null; 
     JSONObject jobj = null; 

     try { 
      jobj = new JSONObject(params[0]); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     try { 
      JSONArray jsonArray = jobj.getJSONArray("rows"); 
      // Log.d("jsonArray", String.valueOf(jsonArray)); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject object = jsonArray.getJSONObject(i); 
       JSONArray ja2 = object.getJSONArray("elements"); 
       for (int j = 0; j < ja2.length(); j++) { 
        JSONObject object3 = ja2.getJSONObject(j); 
        distance = object3.getJSONObject("distance").getString("text"); 
       } 
      } 
      //Log.d("jsonArray", String.valueOf(jsonArray)); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return distance; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     Log.d("St*",s); 
    } 
} 

這是我的錯誤日誌。

java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:838) 
Caused by: java.lang.NullPointerException 
     at com.example.wm.shortestpathdemo.MainActivity$UrlTasks.doInBackground(MainActivity.java:359) 
     at com.example.wm.shortestpathdemo.MainActivity$UrlTasks.doInBackground(MainActivity.java:346) 
     at android.os.AsyncTask$2.call(AsyncTask.java:287) 
+0

'readUrl'返回null – Blackbelt

+0

確切的地方或行你得到空指針? –

+0

我如何讓readUrl()返回數據@Blackbelt –

回答

0

我在創建網址時犯了錯誤。在方法getUrl()中:

private void getUrl() { 
String result = null; 
String dest1 = list.get(0); 
String dest2 = list.get(1); 
String dest3 = list.get(2); 
String start = getAddress(); 

    String urls = "https://maps.googleapis.com/maps/api/distancematrix/json?"; 
    try { 
     encodedString = urls + "origins=" 
       + URLEncoder.encode(start, "utf8")+"|" 
       + URLEncoder.encode(dest1, "utf8")+"|" 
       + URLEncoder.encode(dest2, "utf8")+"|" 
       + URLEncoder.encode(dest3, "utf8") 
       +"&destinations=" 
       + URLEncoder.encode(dest1, "utf8")+"|" 
       + URLEncoder.encode(dest2, "utf8")+"|" 
       + URLEncoder.encode(dest3, "utf8")+"|" 
       + URLEncoder.encode(start, "utf8") 
       +"&mode=driving" 
       // this is the mistake 
       +"&language = en-En" 
       //correct form is 
       +"&language = en" 
       +"&key="+API_KEY; 
     encodedString = encodedString.replaceAll("%2C","+"); 
     encodedString = encodedString.replaceAll("\\++", "+"); 

    } 
相關問題