2012-01-27 2 views
12

저는 안드로이드 세계에서 멍청이이고, 운동을위한 애완 동물 프로젝트를하고 있습니다. 그것은 단지 두 가지 활동이있는 매우 간단한 알림 같은 앱입니다. 하나는 맞춤형 ListView로 기존 알람을 표시합니다. 다른 버튼을 시작하기위한 몇 가지 버튼이 있는데 이는 알람 추가/편집을위한 것입니다. 이전 ListView 활동으로 이어지는 버튼이 있습니다.android.app.Application은 NullPointerException으로 인해 인스턴스화 될 수 없습니다.

내가 최근에 만난 이상한 상황이 있습니다. 내 응용 프로그램이 잘 작동합니다. 하지만 문제는 내가 추가/편집 활동을 트리거하고 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> 
+0

유사한 오류에 대한 [게시물] (http://www.mail-archive.com/[email protected]/msg194903.html)이 있습니다. 스레드 레이스 문제 일 수 있지만 여전히 코드를 수정하는 방법을 모르는 것으로 알고 있습니다. – Selkie

+0

여기에 매니페스트 파일을 추가 할 수 있습니까? – Yury

+0

. 매니페스트가 추가되었습니다. – Selkie

답변

2
좀 더 많은 테스트를했고, 뒤로 버튼에 대한 익명의 내부 클래스의 문제를 로크 온

, 앱을 다시 시작하기 전에 이것을 클릭 할 때마다 오류가 표시되기 때문입니다. 휴대 전화에서 '뒤로 가기'버튼을 사용하여 활동을 전환하면 모든 것이 정상입니다.

나는 내부 클래스

EditEntry.this.finish(); 

그것은 문제를 해결하지에 한 줄을 추가했다. 이번에는 더 체계적으로 테스트하려고했습니다. 의 위의 라인이없는 코드가라고하자,이 라인의 코드가

1.run에 따라 같은 B. 시나리오가가는 것입니다 후 A -> 오류

2.run 다음 B - > 오류

3.run B는 다음 A -> 확인

4.run의 B 후 B -> 확인

따라서, 나는 그것이 활동 스택에 대한 문제는 어떤 종류의 가정?

+0

나는 재현하려고 노력했지만 약간은 할 수 있었지만 더 이상은 할 수 없었다. 컴파일 된 리소스 중 하나가 업데이트되지 않은 결과 일 가능성이 큽니다. 내가 깨끗하게 달렸을 때부터 항상 일하기 시작했다. 해당 행을 다시 "startActivity (intent);로 되돌리려면 오류가 다시 발생합니까? 나는 이것에 정말로 흥미가있다! – MikeC

+0

죄송합니다.이 게시물에서 실수를했습니다. 나는 여러 가지 접근법을 시도했고, 어떻게 든 서로 섞여 있어야합니다. 나는 내 대답을 개정했다. 다시 확인하십시오. – Selkie

+0

@MikeC 귀하의 관심에 감사드립니다. 내 대답을 편집합니다. 나는 프로젝트가 EditEntry.this.finish()와 같은 효과가 있다고 생각한다. 이 배후의 정확한 이유가 무엇인지 아십니까? – Selkie

1

실제로이 문제에 대한 실제 해결책은 폴더 사용 권한 문제입니다. 수정할 수있는 폴더에서 작업하고 있는지 확인하십시오. 난 그냥 올바른 권한을 가진 폴더에 있는지 확인하여 내 자신에 대한 동일한 문제를 해결.

+0

저를 위해 그것을 해결했습니다! – oli

3

다른 코드보다 더 간단한 코드를 사용했지만 정확히 동일한 오류가 발생했습니다. 이클립스에서 다시 실행 한 후에 에뮬레이터에서 응용 프로그램을 닫지 않은 경우에만 문제가 발생한다는 것을 알게되었습니다. 그래서 내가 이클립스에서 실행하기 전에 닫으면, 모든 것이 잘 작동합니다. 그러나 나는 정말로 안드로이드에 처음이기 때문에, 나는 이것이 왜 그렇게인지 전혀 모른다. 나는 이전의 테스트 애플 리케이션이 결코 문제가 아니었다.

관련 문제