Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.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
Java 返回NullPointerException的单例类_Java_Android_Nullpointerexception_Singleton - Fatal编程技术网

Java 返回NullPointerException的单例类

Java 返回NullPointerException的单例类,java,android,nullpointerexception,singleton,Java,Android,Nullpointerexception,Singleton,我有一个单身班。当我试图访问该类的实例时,我得到一个NullPointerException 这是我的密码:- Logout.java private static Logout instance; public Logout() { instance = this; } public static Logout getInstance() { return instance; } public void clearApplicationData() {

我有一个单身班。当我试图访问该类的实例时,我得到一个NullPointerException

这是我的密码:-

Logout.java

private static Logout instance;
public Logout() {

    instance = this;
}
public static Logout getInstance() {
    return instance;
}
public void clearApplicationData() 
     {
       File cache = getCacheDir();
       File appDir = new File(cache.getParent());
        if (appDir.exists()) {
        String[] children = appDir.list();
        for (String s : children) {
            if (!s.equals("lib")) {
                deleteDir(new File(appDir, s));
                Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
            }
        }
    }
}
 public static boolean deleteDir(File dir) {
    if (dir != null && dir.isDirectory()) 
    {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }
    return dir.delete();
}

有人能指出我在这里做错了什么吗?

如果
注销不应该是
活动
创建一个简单的java类并将getInstance函数更改为:

public static Logout getInstance() {
    if(instance==null)
       instance = new Logout();  
    return instance;
}

创建一个如下所示的java类,并像这样更改getinstance函数,首先检查null,如果object为null,则创建一个新对象

public class Logout {
private static Logout dataObject = null;

private Logout () {
    // left blank intentionally
}

public static Logout getInstance() {
    if (dataObject == null)
        dataObject = new Logout ();
    return dataObject;
}
}

Logout
Logout.getInstance
返回null。确保它不为null(类不是单例,构造函数是公共的,因此您可以创建任意多的实例,但最后一个实例(理论上)将分配给单例实例

2) 当您调用getInstance时,您将得到创建的最后一个实例

3) 您并没有在任何地方创建它的实例,所以并没有为实例分配任何内容,所以您得到的是null

对于singleton,以下内容应该是正确的

1) 类必须具有私有构造函数

2) getInstance必须是静态和同步的

3) 对于性能,您可以将synchronized置于可空性的双重检查中

4) 可以在静态块本身中创建和指定实例

5) 在getInstance中,检查实例是否为null,如果为null,则创建新实例,否则返回现有实例

6) 您可以使用新的枚举样式单例

7) 如果类是可序列化的,则实现readResolve


即便如此,由于类加载器或应用程序在生产环境中的不同JVM上运行,您也可能无法实现真正的单例

  • 私有构造函数
  • 静态实例变量,用于保存对单个对象的引用
实现(内置延迟加载)的简单而安全的方法是:


最好在执行Logout.getInstance.clearapplicationData()之前执行空检查,如下所示

if(Logout.getInstance.clearapplicationData() != null){
    Logout.getInstance.clearapplicationData();
}

在您发布的代码中,我看不到您实际创建了一个
Logout
实例(除非有特定于Android的东西可以自动创建此实例或类似的东西),您可能在
onCreate()之前调用了
getInstance()
方法永远不会被使用called@user2625086它似乎是一个活动类。在这种情况下,“onCreate”不是构造函数。最好创建简单的java类。检查调用
onCreate()
的代码,但是您在哪里创建实例?OnCreate不是构造函数!!
public class Logout {
private static Logout instance = new Logout();

private Logout () {    
}

public static Logout getInstance(){
   return instance;
}
if(Logout.getInstance.clearapplicationData() != null){
    Logout.getInstance.clearapplicationData();
}