Java 返回NullPointerException的单例类
我有一个单身班。当我试图访问该类的实例时,我得到一个NullPointerException 这是我的密码:- Logout.javaJava 返回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() {
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();
}