栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么这段代码有时会抛出NullPointerException?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么这段代码有时会抛出NullPointerException?

线程安全

如果您的代码是多线程的,则有可能。例如:

public class C {  private Hashtable agents = new Hashtable();  public iterate() {    if( agents != null ) {      for (Iterator iter = agents.keySet().iterator(); iter.hasNext();) {        // Code goes here      }    }}

如果在语句执行之后(但在循环之前)立即将另一个线程设置

agents
为,则您将获得一个。通过使用访问器(与延迟初始化结合使用)可以避免这种情况。
null``if``for``NullPointerException

另外,如其他人所提到的,如果可能,请避免使用有利于泛型的此类循环构造。有关详细信息,请参见其他答案。

配件提供保护

如果始终使用以下模式,则

NullPointerException
源代码中将永远不会包含s(另一方面,第三方代码可能会间接导致某些原因导致代码失败,这很难避免)。

public class C {  private Hashtable agents;  private synchronized Hashtable getAgents() {    if( this.agents == null ) {      this.agents = new Hashtable();    }    return this.agents;  }  public iterate() {    Hashtable agents = getAgents();    for (Iterator iter = agents.keySet().iterator(); iter.hasNext();) {      // Code goes here    }  }}

遍历代理的代码不再需要检查

null
。由于许多原因,此代码更加健壮。您可以用
Hashmap
(或其他任何抽象数据类型,例如
ConcurrentHashMap<K,V>
)代替
Hashtable

开闭原则

如果您对自己的时间特别慷慨,则可以进行以下操作:

public class C {  private Hashtable agents;  private synchronized Hashtable getAgents() {    if( this.agents == null ) {      this.agents = createAgents();    }    return this.agents;  }  public iterate() {    Iterator i = getAgentKeyIterator();    while( i.hasNext() ) {      // Code that uses i.next() ...    }  }  protected Hashtable createAgents() {    return new Hashtable();  }  private Iterator getAgentKeyIterator() {    return getAgentKeys().iterator();  }  private KeySet getAgentKeys() {    return getAgents().keySet();  }}

这将允许子类(由其他开发人员编写)替换他们自己的正在使用的抽象数据类型的子类(使系统在遵循开放式封闭原则的情况下具有更大的灵活性),而无需修改(或复制/浪费)原始的工作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号