Android NullPointerException в методе OnCreate - PullRequest
1 голос
/ 09 января 2012

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

E/AndroidRuntime(5469): FATAL EXCEPTION: main
E/AndroidRuntime(5469): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
{com.stullich.tim.lolbufftimer/com.stullich.tim.lolbufftimer.LoLBuffTimerMain}: java.lang.NullPointerException
E/AndroidRuntime(5469):at android.app.ActivityThread.performLaunchActivity
(ActivityThread.java:1573) 
E/AndroidRuntime(5469): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
E/AndroidRuntime(5469): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
E/AndroidRuntime(5469): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
E/AndroidRuntime(5469): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(5469): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(5469): at android.app.ActivityThread.main(ActivityThread.java:3691)
E/AndroidRuntime(5469): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(5469): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(5469): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:907)
E/AndroidRuntime(5469): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
E/AndroidRuntime(5469): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(5469): Caused by: java.lang.NullPointerException
E/AndroidRuntime(5469): at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
E/AndroidRuntime(5469): at com.stullich.tim.lolbufftimer.LoLBuffTimerMain.<init>(LoLBuffTimerMain.java:14)
E/AndroidRuntime(5469): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(5469): at java.lang.Class.newInstance(Class.java:1409)
E/AndroidRuntime(5469): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
E/AndroidRuntime(5469): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
E/AndroidRuntime(5469):     ... 11 more

Вот код для основной деятельности:

public class LoLBuffTimerMain extends TabActivity{

Resources res = getResources(); 
TabHost tabHost = getTabHost(); 
TabHost.TabSpec spec;  
Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    intent = new Intent().setClass(this, YourBuffs.class);

    spec = tabHost.newTabSpec("yourbuffs").setIndicator("Your Buffs", 
                        res.getDrawable(R.drawable.tab_view_you))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, EnemyBuffs.class);
    spec = tabHost.newTabSpec("enemybuffs").setIndicator("Enemy Buffs", 
                        res.getDrawable(R.drawable.tab_view_enemy))
                  .setContent(intent);
    tabHost.addTab(spec);
    }
}

и XML:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent">
    <TabWidget android:id="@android:id/tabs"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    <FrameLayout android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">        
    </FrameLayout>
</TabHost>

Ответы [ 3 ]

5 голосов
/ 09 января 2012

Трассировка стека указывает на эту строку как источник исключения:

Resources res = getResources(); 

Унаследованный метод getResources() вызывает исключение. Это потому, что вы не можете вызвать getResources() до тех пор, пока действие не будет сконструировано и инициализировано. Переместите эти инициализации переменных-членов в onCreate(), и все будет хорошо.

1 голос
/ 09 января 2012

Следующие строки должны быть определены внутри onCreate

Resources res = getResources(); 
TabHost tabHost = getTabHost(); 
0 голосов
/ 09 января 2012

Я не уверен в этом, но я думаю, что вы можете сделать getTabHost() только после того, как вы setContentView(). В противном случае getTabHost () возвращает ноль (это поведение похоже на findViewById()).

...