【问题标题】:java.lang.NullPointerException: Attempt to invoke virtual method '.getPackageName()' on a null object reference [duplicate]java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“.getPackageName()”[重复]
【发布时间】:2020-05-25 20:58:57
【问题描述】:

我正在尝试从数据库中获取列表,但突然出现此错误。

错误来自这里:

TinyDB tinydb = new TinyDB(MyApp.getContext());

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

这是 MyApp 的类

public class MyApp extends Application {
 private static MyApp instance;

 public static MyApp getInstance() {
    return instance;
 }

 public static Context getContext(){
    return instance;
    // or return instance.getApplicationContext();
 }

 @Override
 public void onCreate() {
    instance = this;
    super.onCreate();
 }
}

我现在不知道如何解决这个问题。

编辑:

进程:com.example.pangelyn,PID:7750 java.lang.RuntimeException:无法实例化活动 ComponentInfo{com.example.pangelyn/com.example.pangelyn.SwipeLeft}: java.lang.NullPointerException:尝试调用虚拟方法 'java.lang.String android.content.Context.getPackageName()' 为空 对象引用 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 原因:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String android.content.Context.getPackageName()' 在空对象引用上 在 android.content.ContextWrapper.getPackageName(ContextWrapper.java:135) 在 android.app.Activity.getLocalClassName(Activity.java:5854) 在 android.app.Activity.getPreferences(Activity.java:5897) 在 com.example.pangelyn.SwipeLeft.(SwipeLeft.java:28) 在 java.lang.Class.newInstance(本机方法) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1174) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

编辑 2:

public class SwipeLeft extends AppCompatActivity {

float x1,x2,y1,y2;

List<GroupModel> lisSiswaModel = new ArrayList<>();

TinyDB tinydb = new TinyDB(MyApp.getContext());

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

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

    RecyclerView recyclerView = findViewById(R.id.recyclerView_group);

    Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    GroupModel groupModel1 = new GroupModel();
    groupModel1.setName("School");
    String json1 = gson.toJson(groupModel1);
    prefsEditor.putString("groups", json1);
    prefsEditor.commit();

    List<String> json2 = tinydb.getListString("groups");

    for (String string : json2) {
        GroupModel groupModel2 = gson.fromJson(string, GroupModel.class);
        lisSiswaModel.add(groupModel2);
    }

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    GroupAdapter adapter = new GroupAdapter(this, lisSiswaModel);
    recyclerView.setAdapter(adapter);
}

public boolean onTouchEvent(MotionEvent touchEvent){
    switch(touchEvent.getAction()){
        case MotionEvent.ACTION_DOWN:
            x1 = touchEvent.getX();
            y1 = touchEvent.getY();
            break;
        case MotionEvent.ACTION_UP:
            x2 = touchEvent.getX();
            y2 = touchEvent.getY();
            if(x1 > x2 + 250){
                Intent i = new Intent(SwipeLeft.this, MainActivity.class);
                startActivity(i);
                overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
            }
            break;
    }
    return false;
}
}

【问题讨论】:

标签: java android


【解决方案1】:

解决方法是将它移到活动的 onCreate 中(正如它所说,上下文为空):

public class SwipeLeft extends AppCompatActivity {
    float x1,x2,y1,y2;

    List<GroupModel> lisSiswaModel = new ArrayList<>();

    TinyDB tinydb = new TinyDB(MyApp.getContext());

    SharedPreferences mPrefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_groups);
        mPrefs = getPreferences(MODE_PRIVATE);
        ...more code
    }
    ...more code
}

【讨论】:

  • 嗯,我认为这行不通。它仍然抛出相同的异常。
  • 好吧,我在这两种情况下都对其进行了测试,并且有效。不确定您是否有其他地方可以这样做。我是从 SharePrefs 的角度告诉你的。
  • 只需尝试删除 mPrefs 行之后的所有代码,看看它是否有效。如果它有效 - 在我的情况下没有问题 - 你可以从那里构建它,看看它是否在其他地方崩溃。
  • 我不知道你在 TinyDb 中做了什么,因为我没有看到代码,但是 getContext 不会崩溃,因为应用程序首先被初始化,所以上下文不为空。现在,如果你说的是真的,并且它在 TinyDb 中崩溃了,那么你的问题是多方面的。但是,MyApp.getContext 不是其中之一。如果你想测试,用 mPrefs 放回你的代码。
  • 你可以在 onCreate 中加入这样的断言: private Context appContext = MyApp.getContext();然后在 onCreate 你可以检查 assert appContext!=null;
【解决方案2】:

我猜是因为这个TinyDB tinydb = new TinyDB(MyApp.getContext()); 在你的onCreate() 中初始化你的对象而崩溃?

public class SwipeLeft extends AppCompatActivity {

float x1,x2,y1,y2;

List<GroupModel> lisSiswaModel = new ArrayList<>();

TinyDB tinydb;

SharedPreferences mPrefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_groups);
    tinydb = new TinyDB(MyApp.getContext());
    mPrefs = getPreferences(MODE_PRIVATE);

我也想把你的MyApp 改成这个:

public class MyApp extends Application {

    private static MyApp mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }

    public static MyApp getContext() {
        return mContext;
    }
}

不要将mContext = instance 放在super.onCreate() 之前

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2021-08-22
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多