android context nullpointerexception

时间:2011-09-15 09:37:24

标签: android nullpointerexception

我对android Context有一点问题,我不知道如何解决问题。这是我正在使用的代码:

public class TestActivity {
Context context;
public static  String getPackageVersion(){  
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            version = packageInfo.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return version;
    }

    public static boolean checkClientApiVer(String clientApiVer){

        int s = RPCCommunicator.strVerToIntVer(clientApiVer);
        int c = RPCCommunicator.strVerToIntVer(getPackageVersion());

        return (c>=s);
    }

     public boolean execute() {

        serverApiVer = jsonObj.getString("server_api_ver");
        Log.w("SERVER API VER","SHOW SERVER API VERSION : "+serverApiVer);

            checkClientApiVer(serverApiVer);
}

}

它在这一行中表示Nullpointer异常:

PackageManager pm = context.getPackageManager();

实际上我无法使用this.getPackageManager()TestActivity.getPackageManager()而我无法将context设置为this

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

@Roflcoptr指出了基本的,但实际上,你的类没有扩展活动,所以它不是一个上下文,把它改成:

public class TestActivity extends Activity

如果你想让它成为一个实际的活动,或者,如果它只是一个辅助类,则在实例化时将活动传递给它。

答案 1 :(得分:3)

如果您的课程是一项活动,最好将其用作上下文。如果你需要另一个类中的上下文,你可以在applicationContext上有一个单例指针。

public class MyApp extends Application {

    private static MyApp instance;

    public MyApp() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }
}

并在您的清单文件中:

<application
    android:name="com.mycompany.appname.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name">

现在您可以随时拥有

的上下文
MyApp.GetContext();

答案 2 :(得分:2)

问题是您声明了上下文但从未实例化或分配了对它的引用。所以它指向null。

通常,TestActivity应该是Activity类的子类或类似的东西。

在这种情况下,您可以执行类似

的操作
this.getPackageManager();

答案 3 :(得分:2)

您应该通过添加类的构造函数来初始化您的上下文,该构造函数不是Activity,

public TestActivity(Context c) {
   this.context = c;
}

并在您的活动中,通过发送TestActivity作为参数来实例化this

TestActivity tActivity = new TestActivity(this);//this refer to the Activity

第二个解决方案是扩展活动,你应该覆盖方法onCreate()

答案 4 :(得分:1)

而不是在类中创建上下文对象并保持活动或应用程序的引用导致android bcz中的内存泄漏,而不是创建任何特定类的对象。

您可以通过以下步骤

来实现这一目标

1&GT;创建单例类的应用程序上下文并在manifest.xml中定义应用程序类;所以他们将成为整个应用程序生命周期中的一个上下文对象

2 - ;在使用该方法时传递上下文。

public static  String getPackageVersion(Context context){  
    try {
        PackageManager pm = context.getPackageManager();
        PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
        version = packageInfo.versionName;
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
    return version;
}