致命异常主要:方法不起作用

时间:2014-07-15 18:25:50

标签: java android exception nullpointerexception

当我在我的设备上运行我的应用程序时出现此错误: logcat的

  

07-15 14:09:00.808:E / AndroidRuntime(1831):致命异常:主要   07-15 14:09:00.808:E / AndroidRuntime(1831):处理:com.example.findmycar,PID:1831   07-15 14:09:00.808:E / AndroidRuntime(1831):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.findmycar / com.findmycar.activity.PosizioneAttualeActivity}:java.lang.NullPointerException   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.ActivityThread.access $ 800(ActivityThread.java:135)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.os.Handler.dispatchMessage(Handler.java:102)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.os.Looper.loop(Looper.java:136)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.ActivityThread.main(ActivityThread.java:5017)   07-15 14:09:00.808:E / AndroidRuntime(1831):at java.lang.reflect.Method.invokeNative(Native Method)   07-15 14:09:00.808:E / AndroidRuntime(1831):at java.lang.reflect.Method.invoke(Method.java:515)   07-15 14:09:00.808:E / AndroidRuntime(1831):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)   07-15 14:09:00.808:E / AndroidRuntime(1831):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)   07-15 14:09:00.808:E / AndroidRuntime(1831):at dalvik.system.NativeStart.main(Native Method)   07-15 14:09:00.808:E / AndroidRuntime(1831):引起:java.lang.NullPointerException   07-15 14:09:00.808:E / AndroidRuntime(1831):at com.findmycar.activity.PosizioneAttualeActivity.onLocationChanged(PosizioneAttualeActivity.java:264)   07-15 14:09:00.808:E / AndroidRuntime(1831):at com.findmycar.activity.PosizioneAttualeActivity.onCreate(PosizioneAttualeActivity.java:86)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.Activity.performCreate(Activity.java:5231)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)   07-15 14:09:00.808:E / AndroidRuntime(1831):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)   07-15 14:09:00.808:E / AndroidRuntime(1831):... 11 more

这里有.java

package com.findmycar.activity;

import java.util.ArrayList;
import java.util.List;

import com.example.findmycar.R;
import com.findmycar.activity.MainActivity.erroreDialogFragment;
import com.findmycar.activity.MainActivity.simulaLoginDialogFragment;
import com.findmycar.data.Posizione;
import com.findmycar.data.PosizioniDAO;
import com.findmycar.utility.Session;
import com.google.android.gms.maps.CameraUpdateFactoryimport   com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class PosizioneAttualeActivity extends Activity implements LocationListener {

TextView posizioneAttualeWellcome ,latText, lngText, descrizioneText, statoText; 
Button parcheggia, riparti;
LocationManager locationManager;
String provider, username = "";
float lat ,lng ;
Posizione attiva = null, attuale = null;
Location location;
private PosizioniDAO posizioniData;
private GoogleMap FMCMap;

List<Marker> listaMarkerStorico = new ArrayList<Marker>();

protected void onCreate(Bundle savedInstanceState) {

    boolean logged = false;



    if(Session.containsPreference(getApplicationContext(), "username")){
        logged = true; 
        username = Session.getPreference(getApplicationContext(), "username");
    }
    else {
        Log.i("my_security", "l'utente non ha il permesso di accedere a questa vista");
        Intent i = new Intent(PosizioneAttualeActivity.this, MainActivity.class);
        startActivity(i);
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.posizione_attuale);

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (!enabled) {
        gpsDialogFragment l = new gpsDialogFragment();
        l.show(getFragmentManager(), "gpsDialogFragment");
    } 

    Criteria criteria = new Criteria();
      provider = locationManager.getBestProvider(criteria, false);
      location = locationManager.getLastKnownLocation(provider);
      locationManager.requestLocationUpdates(provider, 400, 1, this);

    onLocationChanged(location);

    FMCMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.PosizioneAttualeMapfragment)).getMap();

    FMCMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

    setUpView();
}

public void setUpMarker(Posizione posizione){

    LatLng location=new LatLng(Double.valueOf(posizione.getLat()),Double.valueOf(posizione.getLng()));

    Marker marker = FMCMap.addMarker(new MarkerOptions().position(location).title(posizione.getDescrizione()).icon(BitmapDescriptorFactory.fromResource(R.drawable.logoattivo)));

    if(posizione.getStato()=="1"){

        marker.remove();

        Marker markerNonAttivo = FMCMap.addMarker(new MarkerOptions().position(location).title(posizione.getDescrizione()).icon(BitmapDescriptorFactory.fromResource(R.drawable.logononattivo)));

        listaMarkerStorico.add(markerNonAttivo);

    }


}
public void setUpView(){
    posizioniData = new PosizioniDAO(this);
    posizioniData.open();

    attiva = posizioniData.getPosizioneAttiva(username);

    posizioneAttualeWellcome = (TextView)findViewById(R.id.posizioneAttualeWellcomeTextView); 
    latText = (TextView)findViewById(R.id.latTextView); 
    lngText = (TextView)findViewById(R.id.lngTextView);
    descrizioneText = (TextView)findViewById(R.id.descrizioneTextView);
    statoText = (TextView)findViewById(R.id.statoTextView);

    parcheggia = (Button)findViewById(R.id.parcheggiaButton);
    riparti = (Button)findViewById(R.id.ripartiButton);

    if(attiva == null ){
        attiva = new Posizione();
        attiva.setDescrizione("Vuoi Parcheggiare qui ?");
        attiva.setLat("");
        attiva.setLng("");
        attiva.setStato("1");

        latText.setVisibility(View.INVISIBLE);
        lngText.setVisibility(View.INVISIBLE);
        statoText.setVisibility(View.INVISIBLE);

        parcheggia.setVisibility(View.VISIBLE);
        riparti.setVisibility(View.INVISIBLE);
    }

    else {
        latText.setVisibility(View.VISIBLE);
        lngText.setVisibility(View.VISIBLE);
        statoText.setVisibility(View.VISIBLE);

        parcheggia.setVisibility(View.INVISIBLE);
        riparti.setVisibility(View.VISIBLE);


        setUpMarker(attiva);
    }

    posizioneAttualeWellcome.setText("la Tua Posizione attuale Ë lat:"+lat+", lng: "+lng+" "+username);

    latText.setText(attiva.getLat());
    lngText.setText(attiva.getLng());
    statoText.setText(attiva.getStato());
    descrizioneText.setText(attiva.getDescrizione());

    OnClickListener parcheggiaListener = new OnClickListener(){
        @Override
        public void onClick(View v) {

            Log.i("my_log", "cliccato parcheggia "+v.getId());

            attiva.setLat(String.valueOf(lat));
            attiva.setLng(String.valueOf(lng));
            attiva.setUtente(username);

            posizioniData.creaPosizione(attiva);


            setUpView();


        }
    };
    parcheggia.setOnClickListener(parcheggiaListener);

    OnClickListener ripartiListener = new OnClickListener(){
        @Override
        public void onClick(View v) {

            Log.i("my_log", "cliccato riparti "+v.getId());

            posizioniData.ripartiDaPosizione(attiva);

            setUpView();


        }
    };
    riparti.setOnClickListener(ripartiListener);
}
  @Override
  public void onLocationChanged(Location location) {

    lat = (float) (location.getLatitude());
    lng = (float) (location.getLongitude());

    setUpView();
  }
}

我认为问题是关于onLocationChanged()的方法,实际上第86行和第264行的logcat中的错误是指这些行:

第86行

onLocationChanged(location);

第264行

lat = (float) (location.getLatitude());

1 个答案:

答案 0 :(得分:0)

onCreate方法中,您获取提供商的最后一个已知位置并致电onLocationChanged,但根据documentation for getLastKnownLocation

Returns
 the last known location for the provider, or null

在使用null方法或onLocationChanged方法(或两者)调用onCreate之前,您需要检查位置是否为onLocationChanged