有人问:单例如何返回空指针?
我正在回答这个问题。(我无法在评论中回答,因为我需要发布代码。)
它可能在两个事件之间返回null:(1)加载该类,并且(2)创建该类的对象。这是一个例子:
class X {
    static X xinstance;
    static Y yinstance = Y.yinstance;
    X() {xinstance=this;}
}
class Y {
    static X xinstance = X.xinstance;
    static Y yinstance;
    Y() {yinstance=this;}
}
public class A {
    public static void main(String[] p) {
    X x = new X();
    Y y = new Y();
    System.out.println("x:"+X.xinstance+" y:"+Y.yinstance);
    System.out.println("x:"+Y.xinstance+" y:"+X.yinstance);
    }
}
让我们运行代码:
$ javac A.java 
$ java A
x:X@a63599 y:Y@9036e
x:null y:null
第二行显示Y.xinstance和X.yinstance为null ; 它们为null,因为在它们为null时读取了变量X.xinstance和Y.yinstance。
这个可以解决吗?是,
class X {
    static Y y = Y.getInstance();
    static X theinstance;
    static X getInstance() {if(theinstance==null) {theinstance = new X();} return theinstance;}
}
class Y {
    static X x = X.getInstance();
    static Y theinstance;
    static Y getInstance() {if(theinstance==null) {theinstance = new Y();} return theinstance;}
}
public class A {
    public static void main(String[] p) {
    System.out.println("x:"+X.getInstance()+" y:"+Y.getInstance());
    System.out.println("x:"+Y.x+" y:"+X.y);
    }
}
此代码未显示异常:
$ javac A.java 
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e
但是,这不是Android Application对象的选项:程序员无法控制创建时间。
再一次:第一个示例和第二个示例的区别在于,如果静态指针为null,则第二个示例将创建一个实例。但是,程序员不能创建的系统决定做之前的Android应用程序对象。
更新
还有一个令人费解的示例,其中初始化静态字段恰好是null。
Main.java:
enum MyEnum {
    FIRST,SECOND;
    private static String prefix="<", suffix=">";
    String myName;
    MyEnum() {
        myName = makeMyName();
    }
    String makeMyName() {
        return prefix + name() + suffix;
    }
    String getMyName() {
        return myName;
    }
}
public class Main {
    public static void main(String args[]) {
        System.out.println("first: "+MyEnum.FIRST+" second: "+MyEnum.SECOND);
        System.out.println("first: "+MyEnum.FIRST.makeMyName()+" second: "+MyEnum.SECOND.makeMyName());
        System.out.println("first: "+MyEnum.FIRST.getMyName()+" second: "+MyEnum.SECOND.getMyName());
    }
}
你会得到:
$ javac Main.java
$ java Main
first: FIRST second: SECOND
first: <FIRST> second: <SECOND>
first: nullFIRSTnull second: nullSECONDnull
请注意,您不能将静态变量声明上移一行,该代码将无法编译。
               
              
<application>AndroidManifest.xml文件的节点以包括以下属性定义:android:name="MyApp"。MyApp必须与清单引用的包相同。