Singleton类返回NullPointerException

时间:2014-06-03 04:11:00

标签: java android nullpointerexception singleton

我有一个Singleton类。当我尝试访问类的实例时,我得到一个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();
}

Main.java

Logout.getInstance.clearapplicationData();  //NullPointerException here

有谁可以指出我在这里做错了什么?

6 个答案:

答案 0 :(得分:3)

如果Logout不应该是Activity,则创建一个简单的java类并将getInstance函数更改为:

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

答案 1 :(得分:2)

LogoutLogout.getInstance返回null。确保它不为空

答案 2 :(得分:1)

创建一个类似下面的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;
}
}

答案 3 :(得分:1)

单身人士的两个基本要点:

  • 私人构造函数
  • 用于保存对单个对象的引用的静态实例变量

实现简单而安全的方式(内置延迟加载)是:

public class Logout {
private static Logout instance = new Logout();

private Logout () {    
}

public static Logout getInstance(){
   return instance;
}

答案 4 :(得分:0)

1)类不是单例,构造函数是公共的,因此您可以根据需要创建任意数量的实例,但是最后一个(理论上)将被赋予实例

2)当你调用getInstance时,你将获得最后一个实例

3)你没有在任何地方创建它的实例,因此没有任何东西被分配给实例,因此你得到null

对于单身人士来说应该是真的

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

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

3)对于性能,你可以同步双重检查可空性

4)您可以在静态块本身中创建和分配实例

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

6)你可以使用新的Enum风格单身人士

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

即使在所有这些之后,您可能无法实现真正​​的单例,因为类加载器或在生产中的不同JVM上运行应用程序

答案 5 :(得分:0)

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

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