【问题标题】:Java NPE when trying to call method in non-activity class尝试在非活动类中调用方法时的 Java NPE
【发布时间】:2019-09-13 10:03:02
【问题描述】:

我已经在这里和那里搜索了两天,但似乎没有任何解决方案不起作用。问题出在Fitness.getSessionsClient(this, Objects.requireNonNull(GoogleSignIn.getLastSignedInAccount(2ndclass.mContext))) 及其传递的活动 (this) 和上下文 (2ndClass.mContext) 变量中,我可以通过许多找到的方法填充(变量或非空或空通过调试器检查)。仍然 - 我总是得到 NPE (java.lang.NullPointerException) 或 getApplicationContext() 为空。有什么想法吗?

截图,如果有帮助的话:

崩溃日志行:

E/<SOME TAG>: Error during PUT connection... Data: {"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":13.11,"pressure":1033,"humidity":77,"temp_min":10,"temp_max":16.11},"visibility":10000,"wind":{"speed":3.1,"deg":330},"clouds":{"all":69},"dt":1568357213,"sys":{"type":1,"id":1414,"message":0.0113,"country":"GB","sunrise":1568352700,"sunset":1568398909},"timezone":3600,"id":2643743,"name":"London","cod":200} Message: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

代码片段:

第一个(MainActivity)类:

public class 1stClass extends AppCompatActivity {
    public static 1stClass instance;
    public static Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;
        mContext = getApplicationContext();
    }
public final void 1stmethod(){
        2ndClass.2ndmethod();
}
/**
 * @return instance
 */
@Contract(pure = true)
public static 1stClass getInstance() { return instance; } // return.getInstance();

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

二等:

public class 2ndClass extends 1stClass{
  static 2ndClass instance;
  public final void 2ndmethod() {
  instance = this;
    3rdClass MFP = new 3rdClass();
    MFP.3rdmethod(..);
  }
/**
 * @return instance
 */
@Contract(pure = true)
public static 2ndClass getInstance() { return instance; } //return.getInstance();
}

非活动(第三)类:

public final class 3rdClass extends 2ndClass {
static 3rdClass instance;

public void 3rdmethod() {
    instance = this;
Fitness.getSessionsClient(this, Objects.requireNonNull(GoogleSignIn.getLastSignedInAccount(2ndclass.mContext))) // <---- ERROR HERE
                .insertSession(request)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.i(TAG, "Session insert was successful!");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.wtf(TAG, "There was a problem inserting the session: " +
                                e.getLocalizedMessage());
                    }
                });
/**
 * @return instance
 */
@Contract(pure = true)
public static MFPalInterface getInstance() {
    return instance;
} // return.getInstance();

}

【问题讨论】:

  • 您能否编辑您的代码并添加注释,指出引发异常的行?对于所有这些重命名的方法,我很难弄清楚调用层次结构。另外:所有static 关键字都在敲响警钟
  • 同时添加崩溃日志。
  • @JeroenSteenbeeke,已添加评论!谢谢! :)
  • 无法理解代码中的任何内容(问题),这太脏了
  • 老兄,你的代码太脏了......它有太多的泄漏,static的不必要和非常糟糕的使用

标签: java android android-activity android-context


【解决方案1】:

我想我明白你在做什么,尽管代码是一团糟。

您正在尝试在 2ndClass 的方法“2ndmethod()”中创建自己的活动,然后在新创建的 3rdClass 上调用该方法。

public final void 2ndmethod() {
    3rdClass MFP = new 3rdClass();
    MFP.3rdmethod(..);
}

即使您从AppCompatActivity 扩展了3rdClass,您也没有要求系统创建 Activity 实例并尝试自己创建它。这意味着新创建的实例没有上下文,系统也不知道。


你需要做什么

通过调用您当前正在运行的ActivitystartActivity() 方法(在本例中我认为是2ndClass)并传递一个意图来启动活动。像这样:

Intent intent = new Intent(this, 3rdClass.class);    // this is your current Activity's reference.
currentActivity.startActivity(intent);

【讨论】:

  • 嗯。 @Abbas,我们可以继续聊天吗?我正在尝试实施更改,但这一切都以Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object referenceAttempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 结尾
  • 我加入了!谢谢!
  • 我添加了更多堆栈跟踪和代码片段。如果可能,请检查。我希望它能提供一些有用的信息。谢谢你:)
  • 我已经实现了 Activity 流程,但在 Fitness.* 调用中仍然有 NPE... 实例、活动和上下文已填充 .. 但仍然不好:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2023-04-04
  • 2017-10-01
  • 1970-01-01
  • 2019-05-29
相关资源
最近更新 更多