2017-07-13 16 views
0

我想創建一個簡單的函數,其中可以從郵編中找到信息。在下面提供的代碼中,如果我輸入了有效的郵編,它就可以完全工作。但是當我輸入錯誤的郵政編碼時,問題就會出現。我嘗試使用語句嘗試捕獲,而不是顯示錯誤的完整應用程序崩潰。我也想知道如何限制搜索只在英國。有沒有更好的選擇,通過郵政編碼查找地址,而不是使用getfromlocationName函數。Geocoder getfromlocationName崩潰應用程序

public void finder(String query){ 
     Geocoder geocoder; 
     List<Address> addresses = new ArrayList<Address>(); 
     geocoder = new Geocoder(this, Locale.getDefault()); 

     try { 
      //addresses = geocoder.getFromLocation(51.283973, 1.064928, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5 
      addresses = geocoder.getFromLocationName(query,1); 
     } catch (Exception e) { 

      Toast.makeText(MainActivity.this, "Fail " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 

     String street = addresses.get(0).getThoroughfare(); 
     Log.i("I0",street); 


     String city = addresses.get(0).getLocality(); 
     Log.i("I1",city); 

     String county = addresses.get(0).getSubAdminArea(); 
     Log.i("I2",county); 

     String country = addresses.get(0).getCountryName(); 
     Log.i("I3",country); 
     String postalCode = addresses.get(0).getPostalCode(); 
     Log.i("I4",postalCode); 

     display.setText(street + "\n" + city + "\n" + country + "\n" + postalCode ); } 

誤差

07-13 21:15:26.717 10744-10744/com.example.mandeep.testing I/i1: ct3456 
07-13 21:15:26.856 10744-10744/com.example.mandeep.testing D/AndroidRuntime: Shutting down VM 
07-13 21:15:26.857 10744-10744/com.example.mandeep.testing E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.mandeep.testing, PID: 10744 
                      java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
                       at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                       at java.util.ArrayList.get(ArrayList.java:308) 
                       at com.example.mandeep.testing.MainActivity.finder(MainActivity.java:85) 
                       at com.example.mandeep.testing.MainActivity$1.onQueryTextSubmit(MainActivity.java:47) 
                       at android.widget.SearchView.onSubmitQuery(SearchView.java:1197) 
                       at android.widget.SearchView.access$900(SearchView.java:92) 
                       at android.widget.SearchView$8.onEditorAction(SearchView.java:1175) 
                       at android.widget.TextView.onEditorAction(TextView.java:4473) 
                       at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:139) 
                       at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:304) 
                       at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5219) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
07-13 21:15:26.878 10744-10744/? I/Process: Sending signal. PID: 10744 SIG: 9 

我試圖

if(addresses != null && addresses.size() > 0) { 

      String street = addresses.get(0).getThoroughfare(); 
      Log.i("I0", street); 


      String city = addresses.get(0).getLocality(); 
      Log.i("I1", city); 

      String county = addresses.get(0).getSubAdminArea(); 
      Log.i("I2", county); 

      String country = addresses.get(0).getCountryName(); 
      Log.i("I3", country); 
      String postalCode = addresses.get(0).getPostalCode(); 
      Log.i("I4", postalCode); 

      display.setText(street + "\n" + city + "\n" + country + "\n" + postalCode); 
     } 
     else{ 
      Toast.makeText(MainActivity.this, "No Results Found", Toast.LENGTH_SHORT).show(); 
     } 

還是同樣的問題。

我已編輯的代碼現在

public void finder(String query){ 
     Geocoder geocoder; 
     List<Address> addresses = new ArrayList<Address>(); 
     geocoder = new Geocoder(this, Locale.getDefault()); 

     try { 
      //addresses = geocoder.getFromLocation(51.283973, 1.064928, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5 
      addresses = geocoder.getFromLocationName(query,1); 
     } catch (Exception e) { 

      Toast.makeText(MainActivity.this, "Fail " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 

     Log.i("yes",addresses.size() + ""); 

     if(addresses != null && addresses.size() > 0) { 
      Log.i("yes","checked"); 

      String street = addresses.get(0).getThoroughfare(); 
      Log.i("I0", street); 


      String city = addresses.get(0).getLocality(); 
      Log.i("I1", city); 

      String county = addresses.get(0).getSubAdminArea(); 
      Log.i("I2", county); 

      String country = addresses.get(0).getCountryName(); 
      Log.i("I3", country); 
      String postalCode = addresses.get(0).getPostalCode(); 
      Log.i("I4", postalCode); 

      display.setText(street + "\n" + city + "\n" + country + "\n" + postalCode); 
     } 
     else{ 
      Toast.makeText(MainActivity.this, "No Results Found", Toast.LENGTH_SHORT).show(); 
     } 


    } 

現在的錯誤是

07-13 22:21:02.782 32088-32088/com.example.mandeep.testing I/i1: ct28dx 
07-13 22:21:02.942 32088-32088/com.example.mandeep.testing I/yes: 1 
07-13 22:21:02.942 32088-32088/com.example.mandeep.testing I/yes: checked 
07-13 22:21:02.942 32088-32088/com.example.mandeep.testing D/AndroidRuntime: Shutting down VM 
07-13 22:21:02.944 32088-32088/com.example.mandeep.testing E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.mandeep.testing, PID: 32088 
                      java.lang.NullPointerException: println needs a message 
                       at android.util.Log.println_native(Native Method) 
                       at android.util.Log.i(Log.java:160) 
                       at com.example.mandeep.testing.MainActivity.finder(MainActivity.java:93) 
                       at com.example.mandeep.testing.MainActivity$1.onQueryTextSubmit(MainActivity.java:52) 
                       at android.widget.SearchView.onSubmitQuery(SearchView.java:1197) 
                       at android.widget.SearchView.access$900(SearchView.java:92) 
                       at android.widget.SearchView$8.onEditorAction(SearchView.java:1175) 
                       at android.widget.TextView.onEditorAction(TextView.java:4473) 
                       at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:139) 
                       at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:304) 
                       at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5219) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
07-13 22:21:02.973 32088-32088/com.example.mandeep.testing I/Process: Sending signal. PID: 32088 SIG: 9 

回答

2

您應該檢查數組的大小首先

if(addresses.size() > 0){ 
    String street = addresses.get(0).getThoroughfare(); 
      Log.i("I0",street); 


      String city = addresses.get(0).getLocality(); 
      Log.i("I1",city); 

      String county = addresses.get(0).getSubAdminArea(); 
      Log.i("I2",county); 

      String country = addresses.get(0).getCountryName(); 
      Log.i("I3",country); 
      String postalCode = addresses.get(0).getPostalCode(); 
      Log.i("I4",postalCode); 

      display.setText(street + "\n" + city + "\n" + country + "\n" + postalCode ); 
} 

你特林得到的數據索引0,但你的清單是空的。

+0

我試過還是同樣的問題請看上面我已經添加了代碼 –

+0

首先,告訴我你的應用在檢查後崩潰了嗎? –

+0

我怎麼知道? –

0

此行geocoder.getFromLocationName(query,1);返回一個空的列表。這可能是因爲沒有找到匹配或沒有後端服務(根據https://developer.android.com/reference/android/location/Geocoder.html)。在對列表執行操作之前,您應該檢查addresses != null && addresses.size() > 0是否爲真。

+0

我仍然嘗試過同樣的問題,請參閱上面我已添加的代碼 –

+0

我可以看到錯誤日誌嗎?如果它們與以前一樣,請發送此行'at com.example.mandeep.testing.MainActivity.finder(MainActivity.java:85)'或您的代碼更改後的任何行。 – OgunsanyaTbee

+0

是的,他們是相同的 –

0

如前所述,不要假設Geocoder.getFromLocationName()總是返回結果。它可以返回一個空數組。

另外:

  • Address.getLocality()Address.getAdminArea()可以返回null。你必須檢查這一點。
  • 不要假設Address.getAddressLine(int)中的行數。檢查實際上有多少行Address.getMaxAddressLineIndex()一起返回。