java - 尝试在空对象引用上调用虚拟方法 'android.content.pm.PackageManager android.content.Context.getPackageManager()'

标签 java android nullpointerexception

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference

这是我遇到的错误,即使我从未使用过 getPackageManager() 方法。

以下是我的代码:

AppUtils.java:

public static boolean checkPlayServices() {

    int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mContext);

    if (resultCode != ConnectionResult.SUCCESS) {
        if (GoogleApiAvailability.getInstance().isUserResolvableError(resultCode)) {
            GoogleApiAvailability.getInstance().getErrorDialog((Activity) mContext, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST);
        } else {
            Toast.makeText(mContext, "This Device is not Supported!", Toast.LENGTH_LONG).show();
        }
        return false;
    }
    return true;
}

MyUtils.java:

@Override
protected void onResume() {
    super.onResume();
    utils.checkPlayServices();
}

记录猫错误:

11-18 12:32:07.705 21076-21076/com.vtrak E/AndroidRuntime: FATAL EXCEPTION: main
                                                       Process: com.vtrak, PID: 21076
                                                       java.lang.RuntimeException: Unable to resume activity {com.vtrak/com.vtrak.Activities.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference
                                                           at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3334)
                                                           at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3365)
                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2690)
                                                           at android.app.ActivityThread.access$900(ActivityThread.java:188)
                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530)
                                                           at android.os.Handler.dispatchMessage(Handler.java:111)
                                                           at android.os.Looper.loop(Looper.java:210)
                                                           at android.app.ActivityThread.main(ActivityThread.java:5839)
                                                           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:1113)
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)
                                                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference
                                                           at com.google.android.gms.common.zze.isGooglePlayServicesAvailable(Unknown Source)
                                                           at com.google.android.gms.common.zzc.isGooglePlayServicesAvailable(Unknown Source)
                                                           at com.google.android.gms.common.GoogleApiAvailability.isGooglePlayServicesAvailable(Unknown Source)
                                                           at com.vtrak.Classes.Utils.checkPlayServices(Utils.java:92)
                                                           at com.vtrak.Activities.HomeActivity.onResume(HomeActivity.java:66)
                                                           at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1267)
                                                           at android.app.Activity.performResume(Activity.java:6263)
                                                           at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3319)
                                                           at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3365) 
                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2690) 
                                                           at android.app.ActivityThread.access$900(ActivityThread.java:188) 
                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) 
                                                           at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                           at android.os.Looper.loop(Looper.java:210) 
                                                           at android.app.ActivityThread.main(ActivityThread.java:5839) 
                                                           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:1113) 
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879) 

调用此方法时出现此错误,我不明白为什么我的应用程序崩溃此方法与 checkplayServices() 方法无关:

private void getHistory() {
    /*String assetNo = null;
    Bundle bun = getIntent().getExtras();
    if (bun != null) {

        assetNo = bun.getString(RecyclerAdapter.KEY_VEH_NUM, null);
    }*/
    String startDate = tvDate.getText() + " " + tvStartTime.getText();
    String endDate = tvDate.getText() + " " + tvEndTime.getText();


    Call<ModelHistory> call = Utils.retroInterface.getHistory("SG00iX", "Android", Integer.parseInt(LogInActivity.sharedPreferences.getString(LogInActivity.KEY_RESULT_MSG, null)), "GBE8185Y", startDate, endDate);

    call.enqueue(new Callback<ModelHistory>() {
        @Override
        public void onResponse(Call<ModelHistory> call, Response<ModelHistory> response) {

            for (int i = 0; i < response.body().getData().size(); i++) {


                Log.i("lat long : ", response.body().getData().get(i).getLocLat() + "   " + response.body().getData().get(i).getLocLon());

                listLat.add(Double.valueOf(response.body().getData().get(i).getLocLat()));
                listLat.add(Double.valueOf(response.body().getData().get(i).getLocLon()));

            }

            showInMap(listLat, listLong);

        }

        @Override
        public void onFailure(Call<ModelHistory> call, Throwable t) {
            Log.i("no, ", "its failure" + t.toString());
        }
    });
}

编辑:
终于得到答案了,列表没有初始化,这样初始化,问题解决了:

listLat = new ArrayList<Double>;
listLon = new ArrayList<Double>;

最佳答案

根据 your Above Comment

Alright I didn't initialize utils at first, I was not not supposed to initialize it, its static method I can use directly.

而不是在您的checkPlayServices中传递Context,如下代码

试试这个

public static boolean checkPlayServices(Context mContext) {


    int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mContext);

    if (resultCode != ConnectionResult.SUCCESS) {
        if (GoogleApiAvailability.getInstance().isUserResolvableError(resultCode)) {
            GoogleApiAvailability.getInstance().getErrorDialog((Activity) context, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST);
        } else {
            Toast.makeText(mContext, "This Device is not Supported!", Toast.LENGTH_LONG).show();
        }
        return false;
    }
    return true;
}

而不是像这样调用这个方法

@Override
protected void onResume() {
    super.onResume();
    AppUtils.checkPlayServices(YourActivity.this);
}

关于java - 尝试在空对象引用上调用虚拟方法 'android.content.pm.PackageManager android.content.Context.getPackageManager()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47363451/

相关文章:

用循环构造的东西上的 Java mutator 方法

java - Swing 组件监听自身与内部类

java - static修饰符和static block 的区别

android - 启用 Google Play App Signing 后 Gmail 登录不起作用

java - 什么是 NullPointerException,我该如何解决?

java - 在 Raspberry Pi 上使用 Amazon Echo 控制 OpenHAB

java - 如何在点击按钮时重置 Android 应用程序?

java - 如何向服务请求许可

android - NullPointerException 安卓崩溃

java - 如何在 java 中按字母顺序对字符串数组进行排序?