2016-07-26 2 views
1

어플 리케이션을 실행할 때마다 null 포인터 예외가 발생하는 이유를 알아낼 수 없습니다.이 안드로이드 애플 리케이션은 지오 코딩을 사용하여 맵에 위치를 표시하고 표시합니다. 그러나 나는 수행하지 않았습니다. 실수가 어디 있는지 알지 못해. 제발 도와주세요! 다음과 같이 주요 활동 코드는 다음과 같습니다안드로이드 애플 리케이션의 지오 코딩

package com.dutt.rishabh.locator; 

import android.location.Address; 
import android.location.Geocoder; 
import android.os.AsyncTask; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 


import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

import java.io.IOException; 
import java.util.List; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap mMap; 
    EditText x; 
    Button bfind; 
    String location; 
    MarkerOptions markerOptions; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

     bfind=(Button)findViewById(R.id.bfind); 
     View.OnClickListener findClickListener =new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       x=(EditText)findViewById(R.id.etsearch); 
       location=x.getText().toString(); 
       if(location!=null || location.equals("")){ 
        new GeocoderTask().execute(location); 
       } 
      } 
     }; 
     bfind.setOnClickListener(findClickListener); 



    } 
    private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{ 
     @Override 
     protected List<Address> doInBackground(String... strings) { 
      Geocoder geocoder = new Geocoder(getBaseContext()); 
      List<Address> addresses=null; 
      try { 
       addresses=geocoder.getFromLocationName(strings[0],3); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return addresses; 
     } 
     @Override 
     protected void onPostExecute(List<Address> addresses){ 
      if(addresses==null || addresses.size()==0){ 
       Toast.makeText(getBaseContext(),"No location found",Toast.LENGTH_SHORT).show(); 
      } 
      mMap.clear(); 
      for(int i=0;i<addresses.size();i++){ 
       Address address= addresses.get(i); 
       LatLng latLng=new LatLng(address.getLatitude(),address.getLongitude()); 
       String addressText=String.format("%s,%s",address.getMaxAddressLineIndex()>0?address.getAddressLine(0):"",address.getCountryName()); 
       markerOptions=new MarkerOptions(); 
       markerOptions.position(latLng); 
       markerOptions.title(addressText); 

       mMap.addMarker(markerOptions); 
       if(i==0){ 
        mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); 
       } 
      } 
     } 
    } 



    /** 
    * Manipulates the map once available. 
    * This callback is triggered when the map is ready to be used. 
    * This is where we can add markers or lines, add listeners or move the camera. In this case, 
    * we just add a marker near Sydney, Australia. 
    * If Google Play services is not installed on the device, the user will be prompted to install 
    * it inside the SupportMapFragment. This method will only be triggered once the user has 
    * installed Google Play services and returned to the app. 
    */ 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Sydney and move the camera 
     LatLng sydney = new LatLng(-34, 151); 
     mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
    } 
} 

그래서 내가 이해할 수있는 내 실수를 언급 친절하게 도와주세요. 다음은 logcat입니다 :

07-26 15:02:02.264 30388-30388/com.dutt.rishabh.locator E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.dutt.rishabh.locator, PID: 30388 
                      java.lang.NullPointerException 
                       at com.dutt.rishabh.locator.MapsActivity$GeocoderTask.onPostExecute(MapsActivity.java:75) 
                       at com.dutt.rishabh.locator.MapsActivity$GeocoderTask.onPostExecute(MapsActivity.java:57) 
                       at android.os.AsyncTask.finish(AsyncTask.java:632) 
                       at android.os.AsyncTask.access$600(AsyncTask.java:177) 
                       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
                       at android.os.Handler.dispatchMessage(Handler.java:110) 
                       at android.os.Looper.loop(Looper.java:193) 
                       at android.app.ActivityThread.main(ActivityThread.java:5345) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:515) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
                       at dalvik.system.NativeStart.main(Native Method) 
+0

그것은'onMapRead가()'호출되지 가능)'onPostExecute()'에서,'mMap'은'clear()'를 사용하려고 할 때 null이 될 것입니다. 'mMap'이 null인지 검사 할 수 있습니까? – Jokab

답변

2

NULL 체크는

if(addresses==null || addresses.size()==0){ 
       Toast.makeText(getBaseContext(),"No location found",Toast.LENGTH_SHORT).show(); 
       return; 
      } 
+0

고마워 지금은 일하고있다 – Rishabh

+0

그걸 설명 할 수 있니? – Rishabh

+0

때때로 Geocoder가 텍스트에서 Addresses 개체를 가져올 수 없습니다. 그래서 우리의 텍스트는 유효해야합니다. –

1

귀하의 경우 주소 목록이 null 인 것으로 보입니다. 토스트 메시지를 표시 한 후 코드 실행을 반환 할 수 있습니다. 당신이 (mMap.clear`로를 취소하기 전에 주소

for(int i=0;i<addresses.size();i++){ 
} 

또는 추가 반환

if(addresses==null || addresses.size()==0){ // Line 71 
    Toast.makeText(getBaseContext(),"No location found",Toast.LENGTH_SHORT).show(); 
    return; 
} 
+0

고마워요 – Rishabh

+0

괜찮 으면 내 대답을 받아 들일 수 있습니다. 문제는 주로 위치에 마커를 배치하고 GoogleAPI가 해당 위치의 상대 주소를 찾지 못하는 경우 발생합니다. 이는 위치 기반 앱을 개발하는 과정에서 가장 많이 발생하는 문제입니다. – Naveen

관련 문제