我有一个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
有谁可以指出我在这里做错了什么?
答案 0 :(得分:3)
如果Logout
不应该是Activity
,则创建一个简单的java类并将getInstance函数更改为:
public static Logout getInstance() {
if(instance==null)
instance = new Logout();
return instance;
}
答案 1 :(得分:2)
Logout
或Logout.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();
}