无法获取超类中定义的Context

时间:2016-12-20 04:09:26

标签: java android

我有一个超级班:

public abstract class AsyncRequest {
  private Context context;
  public AsyncRequest(Context context) {
    this.context = context;
  }
  public Context getContext() {
    return this.context;
  }
  protected abstract String getHost();
}

还有两个子类:

public abstract class IRequest extends AsyncRequest{
  IRequest(Context context) {
    super(context);
  }
  @Override
  public String getHost() {
    return getHostFromSharedPreferences();
  }
  private String getHostFromSharedPreferences(){
    SharedPreferences preferences = ((Activity) getContext()).getPreferences(Context.MODE_PRIVATE);
    return preferences.getString(IPresenter.SP_HOST,"");
  }
}

public class LoginRequest extends IRequest{
   public LoginRequest(Context context, String name, String password) {
     super(context);
   }
}

当我初始化LoginRequest时,我使用getContext()来获取IRequest中的上下文,我得到NullPointerException

我不知道为什么,别人知道吗?

4 个答案:

答案 0 :(得分:1)

确保在实例化 LoginRequest 时发送非空 上下文作为参数     LoginRequest(Context context,String name,String password)

答案 1 :(得分:1)

Class A
{
int x;
A(int x)
{
this.x=x;
}
X getX()
{
return this.x;
}
}

你在这里传递给变量“x”有什么价值? 在你的情况下,它是上下文。 要在android中获取类的上下文,总会有一个内置的getApplicationContext()方法。 我的建议是,

Class A
{
Context context;
onCreate Method Block 
{
....................
....................
context=getApplicationContext();
}
}

现在在类中使用此上下文变量,它不会抛出空指针异常。

答案 2 :(得分:0)

我现在才知道问题的原因。

如您所见,我已使用LoginRequest的构造函数初始化context,当然context为null,{{1}中的方法为getContext()我尝试使用AsyncRequest调用将获得一个loginRequest.getContex()的对象。但问题是我尝试调用方法not nullgetContext()中,这意味着IRequest,但我没有初始化iRequest.getContext()iRequest

问题告诉我你应该知道调用该方法的真正对象。我只是认为因为So this is the cause!扩展LoginRequest,当我初始化IRequest时,我初始化{{ 1}},这是一个你需要放弃的坏主意。

因为我需要在扩展LoginRequest的Object中调用相同的代码,所以我调用了IRequest中的代码,但我无法在{{1}中获取IRequest有一种方法可以解决这个问题:

我创建了一个名为IRequest的类,并让它扩展context,在这个类中它有一个属性IRequest,并在App方法中初始化上下文。因为Application在整个android生命周期中都是活着的,所以我可以在任何地方获取它。只需使用public static Context context

最后,谢谢大家尝试解决我的问题。

答案 3 :(得分:-1)

改变这个:

public AsyncRequest(Context context) {
    this.context = context;
}

......对此:

public AsyncRequest(@NonNull Context context) {
    // noinspection ConstantConditions - public API
    if(context == null) {
        throw new NullPointerException();
    }
    this.context = context;
}

您可能会发现您使用null Context调用构造函数。构造函数负责确保对象的字段有效,因此检查无效参数非常重要。