空指针异常(一)

报空指针异常

10-17 09:45:41.209 13290-13290/com.supoin.testhard E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.supoin.testhard, PID: 13290
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.supoin.testhard/com.supoin.gpslibrary.GpsTestActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.supoin.gpslibrary.Application.getString(int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.supoin.gpslibrary.Application.getString(int)' on a null object reference
        at com.supoin.gpslibrary.SectionsPagerAdapter.getPageTitle(SectionsPagerAdapter.java:77)
        at com.supoin.gpslibrary.GpsTestActivity.initActionBar(GpsTestActivity.java:969)
        at com.supoin.gpslibrary.GpsTestActivity.onCreate(GpsTestActivity.java:194)
        at android.app.Activity.performCreate(Activity.java:6042)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697) 
10-17 09:45:41.219 13290-13290/com.supoin.testhard I/Process: Sending signal. PID: 13290 SIG: 9
  • 日志中指出报错的位子为 return Application.get().getString(R.string.gps_status_tab);
 @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case GPS_STATUS_FRAGMENT:
                return Application.get().getString(R.string.gps_status_tab);
            case GPS_MAP_FRAGMENT://
                return Application.get().getString(R.string.gps_map_tab);
            case GPS_SKY_FRAGMENT:
                return Application.get().getString(R.string.gps_sky_tab);
        }
        return null; // This should never happen
    }

再跟踪问题,是Application.get() 为null,那么就是Application 为空,进入Application.java文件中查看,发现是继承的Application没有注册导致的,解决问题就是在Manifest.xml文件中进行注册Application.

只需要给Application标签增加个name属性把自己的 Application的名字加入即可。

public class Application extends android.app.Application {//继承的Application没有注册

    private static Application mApp;

    private SharedPreferences mPrefs;

    public static Application get() {
        return mApp;
    }
...

最后在引用的lib文件中的Manifest.xml文件中进行注册Application.

<application
        android:name=".Application"
         ...
         ...

问题解决。

知识点##

Application 和Activity,Service一样,是Android框架的一个系统组件,当Android程序启动时系统会创建一个application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建。如果需要创建自己的Application,也很简单创建一个类继承application并在manifest的application标签中进行注册(只需要给application标签增加一个name属性把自己的Application的名字定入即可)。

Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,可以说是单例模式的一个类,且application对象的生命周期是整个程序中最长的,他的生命周期就等于这个程序的生命周期。因为他是全局的单例,所以在不同的activity,service中获得的对象都是同一个对象,所以通过application来进行一些,数据传递,数据共享,数据缓存等操作。

posted @ 2018-10-17 10:35  #Skye  阅读(1154)  评论(2编辑  收藏  举报