虽然可以删除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新手,但如果我的想法是否正确,请告诉我,请在评论中告诉我。
答案 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调用。
当然你可能得到NPE
或ConcurrentModificationException
并且你可能想要一个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
为空,则可以将select
,delete
和throws 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);
}