指令'monitor-enter v1'期间出现空指针异常

Ask*_*skQ 7 singleton android nullpointerexception retrofit2

我现在每次都
public void onResponse(呼叫,响应响应)中遇到此错误{:

mContext.runOnUiThread(new Runnable() {
            @Override
            public void run() {

    LocalDBUtility local=LocalDBUtility.getInstance();
//code
}
Run Code Online (Sandbox Code Playgroud)

在我的单例类LocalDBUtility中

static LocalDBUtility localDBUtility;
    private LocalDBUtility(){
    }

    public static LocalDBUtility getInstance(){

        if(localDBUtility==null){
            synchronized (localDBUtility) {
                localDBUtility = new LocalDBUtility();
            }
            return localDBUtility;

        }else {
            return localDBUtility;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想知道是什么原因引起了NPE?

堆栈跟踪:

 java.lang.NullPointerException: Null pointer exception during instruction 'monitor-enter v1'
                                                                   at com.utilities.LocalDBUtility.getInstance(LocalDBUtility.java:34)
                                                                   at com.MainActivity$4.run(MainActivity.java:386)
                                                                   at android.app.Activity.runOnUiThread(Activity.java:5506)
at 

    retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
                                                                   at android.os.Handler.handleCallback(Handler.java:815)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                   at android.os.Looper.loop(Looper.java:194)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5763)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755
Run Code Online (Sandbox Code Playgroud)

Gab*_*han 12

    if(localDBUtility==null){
        synchronized (localDBUtility) {
Run Code Online (Sandbox Code Playgroud)

如果localDBUtility为null,则无法对其进行同步调用.您只能在实例化对象上进行同步.


小智 5

在Java中,引用类型的每个实例都有自己的与之关联的监视器.synchronized块使用此监视器,当线程进入时将其锁定,并在同一线程离开时将其解锁.如果将null引用传递给synchronized块,则将在空引用上调用尝试获取关联监视器的操作,从而导致NullPointerException.因此,您无法在空引用上进行同步.

您可能已经看到要运行的代码正在尝试对同步块使用空引用("localDBUtility == null"),这显然会导致NPE.

注意:监视器是用于实现互斥的同步构造.