0

これは私のプロジェクトで、リスト ビューで病院の名前をクリックすると、次のアクティビティで詳細が表示され、詳細の下にマップビューが表示されます。プロジェクトがクラッシュし、logcat からこのエラーが発生しました

11-30 18:22:50.085: E/AndroidRuntime(13114): FATAL EXCEPTION: main
11-30 18:22:50.085: E/AndroidRuntime(13114): java.lang.NullPointerException
11-30 18:22:50.085: E/AndroidRuntime(13114):    at com.dr.droid.lee.HospResult$GeocoderTask.onPostExecute(HospResult.java:130)
11-30 18:22:50.085: E/AndroidRuntime(13114):    at com.dr.droid.lee.HospResult$GeocoderTask.onPostExecute(HospResult.java:1)
11-30 18:22:50.085: E/AndroidRuntime(13114):    at android.os.AsyncTask.finish(AsyncTask.java)
11-30 18:22:50.085: E/AndroidRuntime(13114):    at android.os.AsyncTask.access$600(AsyncTask.java)
11-30 18:22:50.085: E/AndroidRuntime(13114):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java)

これが私のクラスの私のコードです

public class HospResult extends MapActivity {

    String hcity;
    String hregion;
    String hadd;
    String hname;
    String hcon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Typeface type = Typeface.createFromAsset(this.getAssets(),"MyriadPro-Bold.ttf");
        setContentView(R.layout.map);
        TextView hosname =  (TextView) findViewById(R.id.tvName);
        TextView hosreg =  (TextView) findViewById(R.id.tvRegion);
        TextView hosadd =  (TextView) findViewById(R.id.tvAddress);
        TextView hoscon =  (TextView) findViewById(R.id.tvContact);
        TextView hoscity =  (TextView) findViewById(R.id.tvCity);
        Bundle receive = getIntent().getExtras();
        hcity = receive.getString("city");
        hregion = receive.getString("region");
        hadd = receive.getString("address");
        hname = receive.getString("name");
        hcon = receive.getString("contact");
        hosname.setText(hname);
        hosreg.setText(hregion);
        hoscity.setText(hcity);
        hosadd.setText(hcon);
        hoscon.setText(hadd);
        hosname.setTypeface(type);
        hosreg.setTypeface(type);
        hosadd.setTypeface(type);
        hoscity.setTypeface(type);
        hoscon.setTypeface(type);
        //MapView mv =  (MapView) findViewById(R.id.mv1);
        //MapController mp = mv.getController();
        //mp.setZoom(15);
        String loc = hosname.getText().toString();
        //Toast.makeText(this, loc, Toast.LENGTH_SHORT).show();

        if(loc!=null && !loc.equals("")){
            new GeocoderTask().execute(loc);
        }


    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

    // An AsyncTask class for accessing the GeoCoding Web Service
        private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{

            @Override
            protected List<Address> doInBackground(String... locationName) {
                // Creating an instance of Geocoder class
                Geocoder geocoder = new Geocoder(getBaseContext());
                List<Address> addresses = null;

                try {
                    // Getting a maximum of 3 Address that matches the input text
                    addresses = geocoder.getFromLocationName(locationName[0], 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }           
                return addresses;
            }


            @Override
            protected void onPostExecute(List<Address> addresses) {

                // Getting Reference to MapView of the layout activity_main
                MapView mapView = (MapView) findViewById(R.id.mv1);

                // Setting ZoomControls
                mapView.setBuiltInZoomControls(true);

                // Getting MapController for the MapView
                MapController mc = mapView.getController();
                mc.setZoom(18);

                // Getting Drawable object corresponding to a resource image
                Drawable drawable = getResources().getDrawable(R.drawable.marker);


                // Getting Overlays of the map
                List<Overlay> overlays = mapView.getOverlays();

                // Creating an ItemizedOverlay
                LocationOverlay locationOverlay = new LocationOverlay(drawable,getBaseContext());

                // Clearing the overlays
                overlays.clear();

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

                    // Redraws the map to clear the overlays
                    mapView.invalidate();
                }

                // Adding Markers on Google Map for each matching address
                for(int i=0;i<addresses.size();i++){                

                    Address address = (Address) addresses.get(i);

                    // Creating an instance of GeoPoint, to display in Google Map
                    GeoPoint p = new GeoPoint(
                                              (int)(address.getLatitude()*1E6),
                                              (int)(address.getLongitude()*1E6)
                                             );

                    String addressText = String.format("%s, %s",
                            address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
                            address.getCountryName());


                    // Creating an OverlayItem to mark the point
                    OverlayItem overlayItem = new OverlayItem(p, "Location",addressText);

                    // Adding the OverlayItem in the LocationOverlay
                    locationOverlay.addOverlay(overlayItem);

                    // Adding locationOverlay to the overlay
                    overlays.add(locationOverlay);

                    // Locate the first location
                    if(i==0)
                        mc.animateTo(p);                    
                }

                // Redraws the map
                mapView.invalidate();

            }       
        }

}

130番線はここから始まります

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

この検索のような機能を追加する前に、私のプロジェクトは地図を表示し、罰金を実行していますが、チュートリアルから取得したこの検索のような機能を追加した後、プロジェクトがクラッシュする理由は何ですか? これを修正するにはどうすればよいですか?

4

2 に答える 2

1

でリストを初期化してみてくださいList<Address> addresses = new List<Address>();

@Carnalがここで非常に正しく言ったように、メソッドでリストを取得していることが確実な場合は、リストを初期化する必要はありませgeocoder.getFromLocationNameList<Address> addresses=null.

于 2012-11-30T10:47:30.873 に答える
0

List<Address> addresses = new List<Address>();初期化する必要List<Address> addresses = nullはありませgeocoder.getFromLocationNameList<Address>。問題は、ループを実行する前にアドレス リストが null かどうかを確認していないようです。そして、それはあなたのプログラムをクラッシュさせるようです。

次のチェックを行います。

if(addresses != null && addresses.size() > 0){
    for(int i=0;i<addresses.size();i++){
        // rest of your code..
    }
}
于 2012-11-30T11:09:33.617 に答える