Android.app.Application не может быть создан из-за NullPointerException

Я как-то вроде noob в мире Android, и делаю любимый проект для упражнений. Это очень простое напоминающее приложение с двумя действиями. Один из них - это настроенный ListView, отображающий существующие аварийные сигналы. В нем есть несколько кнопок, чтобы запустить другой, который предназначен для добавления/редактирования сигналов. В нем есть кнопка, которая ведет к предыдущему действию ListView.

Есть странная ситуация, с которой я столкнулся в последнее время. Мое приложение работает нормально. Но проблема в том, что всякий раз, когда я запускаю операцию добавления/редактирования, возвращаюсь обратно в ListView и снова запускаю (или, я должен сказать, переустанавливать?) Приложение. Появится сообщение об ошибке. Но он будет отображаться только вкратце, и приложение запустится.

Сообщение об ошибке, которое я обнаружил в журнале, говорит:

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

В нем явно не указано, где неправильно в моих кодах. Поэтому я не знаю, как исправить это. Кто-нибудь сталкивался с подобной проблемой? Любое предложение будет оценено!

Вот коды активности добавления/редактирования:

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));
        }
    }
}

Манифест выглядит следующим образом:

<?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>

Ответ 1

Я сделал еще несколько тестов и заблокировал проблему в анонимном внутреннем классе для кнопки "Назад", так как ошибка появится, когда я щелкнул ее перед перезапуском приложения. Если я переключаю действия, используя кнопку "вернуться" на телефоне, все в порядке.

Я добавил одну строку во внутренний класс

EditEntry.this.finish();

Он решает проблему. На этот раз я попытался проверить его более систематично. Скажем, код без указанной строки - A, а код с этой строкой - B. Сценарий выглядит следующим образом

1.run A, затем A → Ошибка

2.run A, затем B → Ошибка

3.run B, затем A → OK

4.run B, затем B → OK

Поэтому я предполагаю, что это какая-то проблема в стеке действий?

Ответ 2

У меня была точно такая же ошибка, хотя с другим и более простым кодом, чем у вас. Я выяснил, что проблема возникла, только если я не закрыл приложение в эмуляторе после повторного запуска его из eclipse. Поэтому, если я закрою его, прежде чем запускать его из затмения, все будет хорошо. Но поскольку я действительно новичок в андроиде, я не знаю, почему это так. В предыдущих тестовых приложениях это никогда не было проблемой.

Ответ 3

Фактически, реальным решением этой проблемы является проблема с правами доступа к папке. Убедитесь, что вы работаете в папке, которую вы можете изменить. Я просто исправил эту проблему для себя, убедившись, что я был в папке с правильными разрешениями.