Pytanie android.app.Application nie może być utworzony z powodu wyjątku NullPointerException


Jestem noobem w świecie androidów i wykonuję projekt dla zwierząt domowych. Jest to bardzo prosta aplikacja przypominająca przypomnienie z zaledwie dwoma czynnościami. Jednym z nich jest spersonalizowany ListView wyświetlający istniejące alarmy. Jest kilka przycisków, które uruchamiają drugie, czyli alarmy add / edit. Jest w nim przycisk prowadzący do poprzedniej aktywności ListView.

Jest dziwna sytuacja, z którą ostatnio się spotkałem. Moja aplikacja działa poprawnie. Ale problem polega na tym, że za każdym razem, gdy wyzwalam działanie add / edit, wracam do ListView i ponownie uruchamiam (lub powinienem ponownie zainstalować?) Aplikację. Pojawi się komunikat o błędzie. Ale pojawi się tylko na krótko, a aplikacja uruchomi się.

Komunikat o błędzie, który przechwyciłem w dzienniku, mówi:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException
at android.app.LoadedApk.makeApplication(LoadedApk.java:482)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3909)
at android.app.ActivityThread.access$1300(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:362)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:305)
at android.app.LoadedApk.makeApplication(LoadedApk.java:474)
... 11 more

Nie wskazuje wyraźnie, gdzie w moich kodach jest źle. Więc nie mam pojęcia, jak to poprawić. Czy ktoś napotkał podobny problem? Każda sugestia zostanie doceniona!

Oto kody czynności dodawania / edycji:

public class EditEntry extends Activity
{
    private AutoCompleteTextView foodNameTextView;
    private DatePicker datePicker;
    // store values in AutoCompleteTextView & DatePicker
    private String foodName;
    private Calendar foodDate;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit);
        // dummy selections for AutoCompleteTextView
        String[] foodList = new String[]{"meat", "fruit", "vega"};
        // instantiate AutoCompleteTextView & DatePicker
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.food_list_dropdown, foodList);
        foodNameTextView = (AutoCompleteTextView)findViewById(R.id.foodName);
        foodNameTextView.setAdapter(arrayAdapter);
        datePicker = (DatePicker)findViewById(R.id.date_picker);
        // get intent from ReminderList.
        Intent intent = getIntent();
        // get extras from intent. Return null if intent is sent from "add" action.
        foodName = intent.getStringExtra("foodName");
        foodDate = (Calendar) intent.getSerializableExtra("foodDate");
        // set default values for widgets if it is an "edit" action.
        if (null != foodName)
        {
            foodNameTextView.setText(foodName);
            datePicker.init(foodDate.get(Calendar.YEAR), foodDate.get(Calendar.MONTH), foodDate.get(Calendar.DAY_OF_MONTH), 
                    new OnDateChangedListener()
                    {   // will implement date input check later.
                        @Override
                        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth)   {}
                    });
        }

        // Submit will add/modify the data in xml file. Back will start ReminderList activity
        Button submit = (Button)findViewById(R.id.entry_submit);
        Button back = (Button)findViewById(R.id.entry_back);

        submit.setOnClickListener(new SubmitButtonListener());
        back.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.setClass(EditEntry.this, FoodReminderList.class);
                startActivity(intent);
            }
        });
    }

    // add or modify data in xml file
    @SuppressWarnings("unused")
    class SubmitButtonListener implements OnClickListener
    {
        Calendar foodDate = Calendar.getInstance();

        @Override
        public void onClick(View v)
        {
            XmlUtil xmlUtil = new XmlUtil();
            // determine if it is an "edit" action.
            if (null != foodName)
            {
                FoodInfo foodInfo = new FoodInfo(foodName, foodDate);
                // delete the old data entry
                xmlUtil.deleteEntry(foodInfo);
                // cancel old alarm
                FoodReceiver alarm = new FoodReceiver(EditEntry.this, foodDate, false);
            }
            // get new input values 
            foodName = foodNameTextView.getText().toString();
            foodDate.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), 0, 0, 0);
            // update xml file
            FoodInfo foodInfo = new FoodInfo(foodName, foodDate);
            xmlUtil.updateEntry(foodInfo);
            // set new alarm
            FoodReceiver alarm = new FoodReceiver(EditEntry.this, foodDate, true);
            // popup toast confirming the submit
            Toast.makeText(EditEntry.this, "Reminder Added", Toast.LENGTH_SHORT).show();
            // clear widgets
            foodNameTextView.setText("");
            Calendar currentDate = Calendar.getInstance();
            datePicker.updateDate(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DAY_OF_MONTH));
        }
    }
}

Manifest wygląda następująco:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ca.maxiao.Food"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".FoodReminderList" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:label="@string/app_name"
        android:name=".EditEntry" >
    </activity>
    <activity 
        android:label='@string/app_name'
        android:name=".FoodReminder"></activity>

    <receiver android:name="ca.maxiao.Food.FoodReceiver">
        <intent-filter>
            <action android:name="Alarm_Setting" />
        </intent-filter>
    </receiver>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
</manifest>

12
2018-01-27 19:35


pochodzenie


Tam jest stanowisko o podobnym błędzie. Rozumiem, że może to być problem z wątkami, ale wciąż nie wiem, jak poprawić kody. - Selkie
Czy możesz tutaj dodać swój plik manifestu? - Yury
pewnie. dodano manifest. - Selkie
czy wiesz, co mówi krótki komunikat o błędzie na ekranie? czy można go złapać za pomocą DDMS? - cornbread ninja
oh, powinienem to wyjaśnić. Jest to zwykły komunikat o błędzie, na przykład Niestety, <Nazwa aplikacji> została zatrzymana. - Selkie


Odpowiedzi:


Miałem dokładnie ten sam błąd, chociaż z innym i prostszym kodem niż twój. Odkryłem, że problem wystąpił tylko wtedy, gdy nie zamknąłem aplikacji w emulatorze po ponownym uruchomieniu jej z zaćmienia. Więc jeśli zamknę to przed uruchomieniem od zaćmienia, wszystko działa dobrze. Ale ponieważ jestem naprawdę nowy dla Androida, nie mam pojęcia, dlaczego tak jest. Poprzednie aplikacje testowe nigdy nie stanowiły problemu.


3
2018-06-12 23:48





Zrobiłem kilka dodatkowych testów i zablokowałem problem w anonimowej klasie wewnętrznej przycisku Wstecz, ponieważ błąd pojawi się za każdym razem, gdy kliknę tę opcję przed ponownym uruchomieniem aplikacji. Jeśli przełączę działania za pomocą przycisku "cofnij" w telefonie, wszystko jest w porządku.

Dodałem jedną linię w wewnętrznej klasie

EditEntry.this.finish();

To rozwiązuje problem. Tym razem spróbowałem go bardziej systematycznie przetestować. Powiedzmy, że kod bez powyższej linii to A, a kod z tą linią to B. Scenariusz przebiega jak poniżej

1.run A następnie A -> Błąd

2.run A następnie B -> Błąd

3.run B następnie A -> OK

4.run B następnie B -> OK

Dlatego zakładam, że jest to jakiś problem dotyczący stosu aktywności?


2
2018-01-28 04:53



Próbowałem odtworzyć i mogłem na chwilę, ale już nie. Najprawdopodobniej było to wynikiem tego, że jeden ze skompilowanych zasobów nie został zaktualizowany. Zaczęło działać cały czas, kiedy miałem czyste konto. Jeśli przywrócisz tę linię z powrotem do "startActivity (intent);" czy błąd wraca? Naprawdę jestem zainteresowany tym! - MikeC
Ups, popełniłem błąd w tym poście. Próbowałem kilku podejść, a one jakoś musiały się ze sobą zmieszać. Poprawiłem moją odpowiedź. Sprawdź to jeszcze raz. - Selkie
@MikeC Dziękujemy za zainteresowanie. Edytuję swoją odpowiedź. Myślę, że czysty projekt ma taki sam efekt jak EditEntry.this.finish ()? Czy wiesz, jaki jest tego powód? - Selkie


W rzeczywistości rzeczywistym rozwiązaniem tego problemu jest problem z pozwoleniami na foldery. Upewnij się, że działasz w folderze, który możesz modyfikować. Po prostu naprawiłem ten sam problem, upewniając się, że jestem w folderze z odpowiednimi uprawnieniami.


1
2018-03-23 07:31



to rozwiązało dla mnie! - oli