Android 为什么已经声明的上下文上存在NullPointerException?
我在已定义的上下文变量上的空对象引用上获得了一个Android 为什么已经声明的上下文上存在NullPointerException?,android,nullpointerexception,Android,Nullpointerexception,我在已定义的上下文变量上的空对象引用上获得了一个android.content.Context android.content.Context.getApplicationContext()。我正在遵循Android开发的Big Nerd Ranch指南,但代码给了我这个似乎没有根据的错误 这就是我声明上下文变量的地方mContext: public class CrimeLab { private static CrimeLab sCrimeLab; private List
android.content.Context android.content.Context.getApplicationContext()。我正在遵循Android开发的Big Nerd Ranch指南,但代码给了我这个似乎没有根据的错误
这就是我声明上下文变量的地方mContext
:
public class CrimeLab {
private static CrimeLab sCrimeLab;
private List<Crime> mCrimes = new ArrayList<>();
private Context mContext;
private SQLiteDatabase mDatabase;
...
}
public class CrimeLab{
私人静态CrimeLab sCrimeLab;
private List mCrimes=new ArrayList();
私有上下文;
私有SQLITE数据库mDatabase;
...
}
但是这行代码抛出了一个空对象引用:
public CrimeLab(Context context) {
mContext = context.getApplicationContext(); <- This one
mDatabase = new CrimeBaseHelper(mContext)
.getWritableDatabase();
mCrimes = new ArrayList<>();
}
public CrimeLab(上下文){
mContext=context.getApplicationContext();在某个地方,您正在调用newcrimelab(null)
或以其他方式将null
传递到CrimeLab
构造函数中
在您现在更新的问题中,您正在以下位置创建一个新的CrimeLab
:
public static CrimeLab get(Context context) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(context);
}return sCrimeLab;
}
因此,传递到get()
的Context
是null
并修复参数,使其不为null
我解决了它。问题是在另一个类中。它没有明确地说null
,但它传递了一个错误的变量。我所要做的就是删除它。我只是浏览了我所有的java文件,找不到类似的东西。@OnurOzbek这不是明确的I don’我不喜欢这样,你正在传递一个为空的上下文。如果我把所有的Java文件都放在这里(太长了),会有帮助吗我已经放置了我的CrimeLab.java文件。@非常感谢Commonware。你帮了我很大的忙。还有,我的问题不好吗?Idk为什么它被否决了两次。如果你认为这是一个问得很好的问题,你介意给我一个向上的一票吗?附言:我喜欢你的书。你应该通过调用CrimeLab的con来提供创建这种对象的代码structor。我真的看不出来。你正在某处创建新的CrimeLab(…)
或CrimeLab.get(…)
@cricket\u 007询问Big Nerd Ranch Guide的作者。@cricket\u 007除非其UI相关,否则通常最好使用应用程序上下文。例如,如果您正在创建一个将由多个活动使用的单例类,它就不能使用活动上下文。如果您的类保存了上下文,它就不应该保存它应该保存的主上下文保存应用程序上下文,以便在对象泄漏时将危害降至最低。请显示您为帮助他人解决此问题而更改的代码。我有一行代码context context=new context(此)
在另一个未使用的类中。删除该类解决了问题。那是在活动中,在onCreate
之外,我猜?根据我的经验,您永远不需要创建新上下文()
因为活动是一个上下文,你几乎总是有一个活动引用是的。它超出了创建时的范围。而且,我不知道为什么我两次被否决。我的问题出了什么问题?
public class CrimeLab {
private static CrimeLab sCrimeLab;
private List<Crime> mCrimes = new ArrayList<>();
private Context mContext;
private SQLiteDatabase mDatabase;
public void addCrime(Crime c){
mCrimes.add(c);
}
public CrimeLab(Context context) {
mContext = context.getApplicationContext();
mDatabase = new CrimeBaseHelper(mContext)
.getWritableDatabase();
mCrimes = new ArrayList<>();
}
public static CrimeLab get(Context context) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(context);
}return sCrimeLab;
}
public List<Crime> getCrimes() {
return mCrimes;
}
public Crime getCrime(UUID id){
for (Crime crime : mCrimes){
if(crime.getID().equals(id)){
return crime;
}
}
return null;
}
}
public static CrimeLab get(Context context) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(context);
}return sCrimeLab;
}