Error:
I would like to understand in what scenario the following example would cause a null pointer exception.
For example:
1)
public class DataLoaderAsync {
private volatile Future task = null;
private ReentrantLock reentrantLock = new ReentrantLock();
public void start(Runnable runnable) {
if (this.task == null) {
try {
reentrantLock.lock();
if (this.task == null) {
this.task = ExecutorServiceMgr.getCatWrappedExecutorService().submit(runnable);
}
} finally {
reentrantLock.unlock();
}
}
}
public void waitForCompletion() {
Future currentTask = this.task;
if (currentTask == null) {
throw new DataLoaderRuntimeException("The task is not initialized yet");
}
if (currentTask.isDone()) {
return;
}
try {
reentrantLock.lock();
if (currentTask.isDone()) {
return;
}
FutureUtil.getOrCatch(currentTask);
} finally {
***reentrantLock.unlock();*** // null position
}
}
}
waitForPolicyLoader java.lang.NullPointerException: Cannot invoke "java.util.concurrent.locks.ReentrantLock.unlock()" because "this.reentrantLock" is null
at xxxx.DataLoaderAsync.waitForCompletion(DataLoaderAsync.java:58)
at xxxx.DataBusiness.waitForLoader(DirectPolicyDataBusiness.java:97)
at xxxx.DataBusiness.loadPolicies(ShareSpecialPolicyDataBusiness.java:204)
at com.dianping.cat.async.CatWrappedRunnable.run(CatWrappedRunnable.java:29)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:74)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82)
at java.base/java.util.concurrent.ThreadPerTaskExecutor$TaskRunner.run(ThreadPerTaskExecutor.java:314)
at java.base/java.lang.VirtualThread.run(VirtualThread.java:309)
2)
public static Set<SubKey> getOrLoadPolicies(Context searchContext) {
try {
Set<SubKey> policies = searchContext.getReadonlyInfo().getPolicies();
if (policies != null) {
return policies;
}
Set<SubKey> avRedis = READER.getPolicies(searchContext);
searchContext.getReadonlyInfo().setPolicies(avRedis); // null position
return avRedis;
} catch (Exception e) {
LogManager.build(LOG_LOCATION, "getPolicies", e).error();
}
return Sets.newHashSet();
}
getPolicies java.lang.NullPointerException: Cannot invoke "xxx.setPolicies(java.util.Set)" because the return value of "xxx.Context.getReadonlyInfo()" is null
at xxx.getOrLoadPolicies(Forbidden.java:183)
at xxx.init(AbstractPolicyFilter.java:173)
at xxx.<init>(AbstractPolicyFilter.java:111)
at com.dianping.cat.async.CatWrappedRunnable.lambda$run$0(CatWrappedRunnable.java:30)
at com.dianping.cat.async.CatAsyncSupportTemplate.doExecute(CatAsyncSupportTemplate.java:121)
at com.dianping.cat.async.CatAsyncSupportTemplate.execute(CatAsyncSupportTemplate.java:96)
at com.dianping.cat.async.CatWrappedRunnable.run(CatWrappedRunnable.java:29)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:74)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82)
at java.base/java.util.concurrent.ThreadPerTaskExecutor$TaskRunner.run(ThreadPerTaskExecutor.java:314)
at java.base/java.lang.VirtualThread.run(VirtualThread.java:309)
java version:
openjdk version “21.0.3” 2024-04-16 LTS
OpenJDK Runtime Environment Temurin-21.0.3+9 (build 21.0.3+9-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.3+9 (build 21.0.3+9-LTS, mixed mode, sharing)
Know what scenarios will trigger it.
New contributor
user26373326 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.