Эмулятор Android: не удается запустить дескриптор исключения нулевого указателя действия

#android #nullpointerexception #android-emulator

#Android #Исключение nullpointerexception #android-эмулятор

Вопрос:

Приложение может нормально работать на моем реальном устройстве, оно может запускаться и запускаться на эмуляторе, однако, когда я вхожу в систему и использую метод onCreate, он выдает ошибку, как показано ниже. Эмулятор настроен со всеми необходимыми спецификациями, такими как правильный уровень API и разрешенное использование SD-карты для памяти (200 Мбайт). Есть ли какое-либо представление о том, как устранить эту ошибку?

 06-24 10:19:53.060: E/AndroidRuntime(625): FATAL EXCEPTION: main
06-24 10:19:53.060: E/AndroidRuntime(625): Process: com.example.bestapp, PID: 625
06-24 10:19:53.060: E/AndroidRuntime(625): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bestapp/com.example.best.MainActivity}: java.lang.NullPointerException
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2270)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.ActivityThread.access$800(ActivityThread.java:138)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.os.Handler.dispatchMessage(Handler.java:102)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.os.Looper.loop(Looper.java:136)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.ActivityThread.main(ActivityThread.java:5042)
06-24 10:19:53.060: E/AndroidRuntime(625):  at java.lang.reflect.Method.invokeNative(Native Method)
06-24 10:19:53.060: E/AndroidRuntime(625):  at java.lang.reflect.Method.invoke(Method.java:515)
06-24 10:19:53.060: E/AndroidRuntime(625):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:776)
06-24 10:19:53.060: E/AndroidRuntime(625):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-24 10:19:53.060: E/AndroidRuntime(625):  at dalvik.system.NativeStart.main(Native Method)
06-24 10:19:53.060: E/AndroidRuntime(625): Caused by: java.lang.NullPointerException
06-24 10:19:53.060: E/AndroidRuntime(625):  at com.example.bestapp.MainActivity.onCreate(MainActivity.java:59)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.Activity.performCreate(Activity.java:5231)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-24 10:19:53.060: E/AndroidRuntime(625):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2172)
 

Метод MainActivity onCreate:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    viewPager = (ViewPager) findViewById(R.id.pager);
    FragmentManager fragmentManager = getSupportFragmentManager();
    viewPager.setAdapter(new MyAdapter(fragmentManager));


        // Get the location manager
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // Define the criteria how to select the location provider -> use
        // default
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);
        Context context;

        // Just test displaying
        lat = (float) (location.getLatitude());
        lng = (float) (location.getLongitude());


    // Set up the action bar to show a dropdown list.
    final android.app.ActionBar actionBar = getActionBar();
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

    // Populating the dropdown menu
    ArrayList<String> itemList = new ArrayList<String>();


    // Get the present day
    Calendar calendar = Calendar.getInstance();
    int today = calendar.get(Calendar.DAY_OF_WEEK);

    itemList.add("Today");
    if (today == 2) {
        itemList.add("Tues");
        itemList.add("Weds");
        itemList.add("Thurs");
        itemList.add("Fri");
    }
    if (today == 3) {
        itemList.add("Weds");
        itemList.add("Thurs");
        itemList.add("Fri");
        itemList.add("Sat");
    }
    if (today == 4) {
        itemList.add("Thurs");
        itemList.add("Fri");
        itemList.add("Sat");
        itemList.add("Sun");
    }
    if (today == 5) {
        itemList.add("Fri");
        itemList.add("Sat");
        itemList.add("Sun");
        itemList.add("Mon");
    }
    if (today == 6) {
        itemList.add("Sat");
        itemList.add("Sun");
        itemList.add("Mon");
        itemList.add("Tues");
    }
    if (today == 7) {
        itemList.add("Sun");
        itemList.add("Mon");
        itemList.add("Tues");
        itemList.add("Weds");
    }
    if (today == 1) {
        itemList.add("Mon");
        itemList.add("Tues");
        itemList.add("Weds");
        itemList.add("Thurs");
    }

    ArrayAdapter<String> aAdpt = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1,
            itemList) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            TextView text = (TextView) view
                    .findViewById(android.R.id.text1);
            text.setTextColor(Color.WHITE);
            return view;
        }


    };

    // Assign list to actionbar
    actionBar.setListNavigationCallbacks(aAdpt, null);

}
 

Комментарии:

1. Местоположение location = LocationManager.getLastKnownLocation(поставщик); getLastKnownLocation может возвращать значение null

2. @blackbelt есть ли улучшенный способ предотвратить присвоение null?

3. какой номер строки 59 в MainActivity.java ?

4. @blackbelt есть ли лучший способ отправить координаты GPS в эмулятор, я использовал DDMS и «отправил» координаты вручную, но, возможно, эмулятор их не получает? Шаги по порядку: запустить приложение в эмуляторе -> отправить координаты-> войти в систему -> сбой приложения. Правильно ли это?

5. @eatlon я знаю, но все равно это не отвечает на его вопрос

Ответ №1:

 locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // get last location
    Location lastLoc = locMan
            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if (lastLoc == null) {
        lastLoc = locMan
                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    }
    double lastlat = lastLoc.getLatitude();
    double lastlng = lastLoc.getLongitude();
 LatLng lastLatLng = new LatLng(lastlat, lastlng);
 

// В случае, если вам нужен пример Карт Google

  userMarker = map.addMarker(new MarkerOptions().position(lastLatLng)
            .title("You are here")
            .icon(BitmapDescriptorFactory.fromResource(userIcon))
            .snippet("Your last recorded location"));
 

Комментарии:

1. Ошибка возникает только при запуске на эмуляторе, а не на реальном устройстве. Я отправляю координаты через DDMS, но это все равно не помогает. Предотвратит ли это ваша реализация?

2. Нет, этого не будет. я добавил некоторый код, который работал для моего эмулятора.

3. не могли бы вы добавить обратно код, который у вас был, этот ответ теперь неполный… что в классе LatLng…

4. он добавлен, я использую это для добавления маркеров и увеличения масштаба до текущей позиции (этот код не добавлен) я могу отправить вам весь класс, если хотите, но в чате, так как это длинный код

5. Спасибо, это намного надежнее