我有一个超级班:
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
。
我不知道为什么,别人知道吗?
答案 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 null
在getContext()
中,这意味着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
调用构造函数。构造函数负责确保对象的字段有效,因此检查无效参数非常重要。