我以下代碼:爲什麼在這裏NetBeans顯示關於空指針解除引用的警告?
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class NullDereference {
private static final ConcurrentMap<Integer, Object> MAP = new ConcurrentHashMap<>();
public static void main(String[] args) {
Object object = getObject(1);
if (object == null) {
Lock lock = new ReentrantLock();
lock.lock();
try {
lock.newCondition().await(1, TimeUnit.SECONDS);
object = new Object();
object = addObject(object); // [3]
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
} finally { // [1]
lock.unlock(); // [1]
}
}
System.out.println("class: " + object.getClass()); // [2]
}
private static Object getObject(int hashCode) {
return MAP.get(hashCode);
}
private static Object addObject(Object newObject) {
Object oldObject = MAP.putIfAbsent(newObject.hashCode(), newObject);
if (oldObject != null) {
return oldObject;
}
return newObject;
}
}
NetBeans的顯示警告有關在線路 「取消引用可能空指針」[2]。我不知道爲什麼。我認爲這是因爲行[3],但是當我註釋掉行[3]時,警告仍然存在。當我在行[2]之前顯式檢查空值時,或者當我註釋掉整個finally
語句(由[1]註釋的行)時,該警告消失。
我分析了代碼,認爲這一個是誤報。我對麼?
我不想額外檢查空指針。這段代碼有什麼問題?我可以改變一些東西來使代碼沒有警告嗎?
因爲沒有強大的聲明,認爲編譯器,「對象」被初始化,永遠不會給null –