私は、コードを以下ました:ここで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] "可能NULLポインタを間接参照" に関する警告が表示されます。なぜ私は分からない。私はそれが行[3]のためだと思っていましたが、私が行[3]をコメントアウトすると、警告はまだここにあります。私は行[2]の前にヌル値を明示的にチェックするか、finally
文全体([1]で注釈が付けられた行)をコメントアウトすると警告が消えます。
私はコードを分析し、これが偽陽性と考えています。私は正しいですか?
ヌルポインタの追加チェックをしたくありません。このコードで何が間違っていますか?警告なしにコードを変更することはできますか?
強力なステートメントがないため、 'object'が初期化され、決してnullを返さないとコンパイラが判断する –