Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么已经声明的上下文上存在NullPointerException?_Android_Nullpointerexception - Fatal编程技术网

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;
}