指令期间出现空指针异常 'monitor-enter v1'
Null pointer exception during instruction 'monitor-enter v1'
我现在每次都会收到这个错误
里面 public void onResponse(Call call, Response response){:
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
LocalDBUtility local=LocalDBUtility.getInstance();
//code
}
在我的单例中 class LocalDBUtility
static LocalDBUtility localDBUtility;
private LocalDBUtility(){
}
public static LocalDBUtility getInstance(){
if(localDBUtility==null){
synchronized (localDBUtility) {
localDBUtility = new LocalDBUtility();
}
return localDBUtility;
}else {
return localDBUtility;
}
}
我想知道是什么导致了NPE?
堆栈跟踪:
java.lang.NullPointerException: Null pointer exception during instruction 'monitor-enter v1'
at com.utilities.LocalDBUtility.getInstance(LocalDBUtility.java:34)
at com.MainActivity.run(MainActivity.java:386)
at android.app.Activity.runOnUiThread(Activity.java:5506)
at
retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.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
if(localDBUtility==null){
synchronized (localDBUtility) {
如果 localDBUtility 为 null,则不能对其调用同步。您只能在实例化对象上同步。
在 Java 中,引用类型的每个实例都有自己的关联监视器。 synchronized 块使用这个监视器,当一个线程进入时锁定它,当同一个线程离开它时解锁它。
如果您将空引用传递给同步块,将在空引用上调用尝试获取关联监视器的操作,这会导致 NullPointerException。因此,您不能对空引用进行同步。
您可能已经看到您要 运行 的代码正在尝试对同步块使用空引用 ("localDBUtility==null"),这显然会导致 NPE。
注意:
监视器是用于实现互斥的同步构造。
我现在每次都会收到这个错误
里面 public void onResponse(Call call, Response response){:
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
LocalDBUtility local=LocalDBUtility.getInstance();
//code
}
在我的单例中 class LocalDBUtility
static LocalDBUtility localDBUtility;
private LocalDBUtility(){
}
public static LocalDBUtility getInstance(){
if(localDBUtility==null){
synchronized (localDBUtility) {
localDBUtility = new LocalDBUtility();
}
return localDBUtility;
}else {
return localDBUtility;
}
}
我想知道是什么导致了NPE?
堆栈跟踪:
java.lang.NullPointerException: Null pointer exception during instruction 'monitor-enter v1'
at com.utilities.LocalDBUtility.getInstance(LocalDBUtility.java:34)
at com.MainActivity.run(MainActivity.java:386)
at android.app.Activity.runOnUiThread(Activity.java:5506)
at
retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.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
if(localDBUtility==null){
synchronized (localDBUtility) {
如果 localDBUtility 为 null,则不能对其调用同步。您只能在实例化对象上同步。
在 Java 中,引用类型的每个实例都有自己的关联监视器。 synchronized 块使用这个监视器,当一个线程进入时锁定它,当同一个线程离开它时解锁它。 如果您将空引用传递给同步块,将在空引用上调用尝试获取关联监视器的操作,这会导致 NullPointerException。因此,您不能对空引用进行同步。
您可能已经看到您要 运行 的代码正在尝试对同步块使用空引用 ("localDBUtility==null"),这显然会导致 NPE。
注意: 监视器是用于实现互斥的同步构造。