背景
我想了解为什么一段代码不会抛出NullPointerException.
源代码
请考虑以下代码:
public class Agent { public List files = new ArrayList(); public void deliver() { if( files != null && files.iterator().hasNext() ) { File file = (File)files.iterator().next(); } files = new ArrayList(); } }
public void run() { agent.files = null; }
只有一个代理程序实例.
问题
永远不会抛出NullPointerException.
但是,当传递方法暂停时,即使是0毫秒,也会按预期抛出NullPointerException:
public void deliver() { if( files != null ) { Thread.currentThread().sleep( 0 ); if( files.iterator().hasNext() ) { File file = (File)files.iterator().next(); } } files = new ArrayList(); }
我的理解是,理论上,在检查文件== null和调用files.iterator().hasNext()之间存在竞争条件.在实践中,我不能在不引入暂停的情况下触发竞争条件(即,从后续方法调用中拆分空检查).
题
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。