我应该将什么Try / Catch块用于HashMap.get()?

时间:2015-02-22 05:43:12

标签: java hashmap try-catch

虽然可以删除HashMap项,或者用户可能输入HashMap中不存在的密钥,但我应为Try/Catch添加哪种.get()块方法?

这是我的代码示例:

public class ProjectModel {

    private int size = 0;
    private Project[] projects = new Project[100];
    private HashMap<Integer, Integer> index = new HashMap<Integer, Integer>();

    public Project create(){

        Project project = new Project();
        int id = project.getId();
        projects[size] = project;
        index.put(id, size);        
        size++;     
        return project;

    }

    public Project select(int id){

        int i = index.get(id); //<----- get method here
        Project project = projects[i];
        return project;

    }

    public void delete(int id){

        int i = index.get(id);      
        projects[i] = null;
        index.remove(id);

    }



}

附加说明: 我问这个是因为我不想让用户选择一个不存在的项目。 就像有5个项目,但我尝试ProjectModel.select(6); 每当HashMap.get()返回null时,我想处理它(在我看来它是流程的例外)。

编辑:

我已经阅读了答案的评论,谢谢。虽然我是Java新手,但如果我的想法是否正确,请告诉我,请在评论中告诉我。

  1. 从&#34;对象选择功能&#34;
  2. 返回null是可以的
  3. 而不是在这个单元中抛出Exception,最好在我调用ProjectModel.select()的地方执行错误处理。

4 个答案:

答案 0 :(得分:3)

从表面上看,这句话不能引发异常:

  int i = index.get(id); //<----- get method here

index字段不会null,而get不会提升NPE。

但是......即便如此,NPE也会发生。问题是如果get(id)返回null,当您尝试将null取消装箱以将值分配给i时,将会抛出NPE!

然而,正确的解决方案是避免使用NPE而不是捕获它。

 Integer i = index.get(id);
 if (i == null) {
     // deal with this as appropriate
 } else {
     return projects[i];
 }

答案 1 :(得分:2)

您不需要try / catch块; HashMap.get将根据其Javadoc中指定的缺失密钥返回null

  

返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

答案 2 :(得分:0)

  

我应该将什么Try / Catch块用于HashMap.get()?

无。 get()方法不会抛出任何缓存的异常,因此您不需要使用try catch块来包装get调用。

当然你可能得到NPEConcurrentModificationException并且你可能想要一个try catch块,但是一般的编程实践要求你不应该处理这样的运行时异常,而是编写避免它们的代码比如添加空检查。

如果你想知道是否存在条目,你可以调用containsKey() meythod或检查get call本身的返回值。

public V get(Object key) {
    if (key == null)
        return getForNullKey();
    Entry<K,V> entry = getEntry(key);

    return null == entry ? null : entry.getValue();
}

如果Entry不存在,则应该返回null作为返回值。

答案 3 :(得分:0)

您真的不需要try/catch使用get HashMap方法,因为它不会抛出任何异常,如果未找到ID或create为空,则可以将selectdeletethrows custom exception方法标记为index.get(id)

public void delete(int id) throws SomeCustomException {
    if (index.get(id) == null) {
        throw new SomeCustomException("No such element exists");
    }
    int i = index.get(id);
    projects[i] = null;
    index.remove(id);
}