【问题标题】:Fatal exception main: a method does not work致命异常主要:方法不起作用
【发布时间】:2014-09-06 01:54:13
【问题描述】:

当我在我的设备上运行我的应用程序时,会出现以下错误: 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-15 14:09:00.808: E/AndroidRuntime(1831): 在 java.lang.reflect.Method.invoke(Method.java:515) 07-15 14:09:00.808: E/AndroidRuntime(1831): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 07-15 14:09:00.808: E/AndroidRuntime(1831): 在 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): 在 com.findmycar.activity.PosizioneAttualeActivity.onLocationChanged(PosizioneAttualeActivity.java:264) 07-15 14:09:00.808: E/AndroidRuntime(1831): 在 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 更多

这里有.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());

【问题讨论】:

  • 请包含必要的最短代码以重现问题。
  • 您提供的代码很长而且很混乱。很难找到错误的位置。此外,我们甚至不知道代码应该做什么。
  • 也许location 为空?
  • 是的,一定是。 location = locationManager.getLastKnownLocation(provider); 大概 getLastKnownLocation 可以返回 null 并且此代码不会检查。对。在getLastKnownLocation的文档中确认了

标签: java android exception nullpointerexception


【解决方案1】:

在您的onCreate 方法中,您获取提供者的最后一个已知位置并调用onLocationChanged,但根据documentation for getLastKnownLocation

退货
 提供者的最后一个已知位置,或 null

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

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2018-04-30
    • 2012-06-02
    • 2012-09-08
    • 2014-02-07
    • 2012-10-12
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多