从对象列表中查找最后一个对象,如果找不到则抛出异常
Find last object from a list of objects, throw exception if not found
要求:从不同对象的列表中找到最后一个Bar对象,如果找不到则抛出NoSuchElementException
Bar findLast(List stuff) throws NoSuchElementException { }
我的解决方案:
Bar findLast(List stuff) throws NoSuchElementException {
Bar bar = new Bar();
for(int i=stuff.size()-1;i>=0;i--){
if(stuff.get(i).getClass().isInstance(bar)){
return (Bar) stuff.get(i);
}
}
throw new NoSuchElementException();
}
问题:
- 我们需要方法头中的
throws NoSuchElementException
吗?
- 在方法的最后一行是否需要
try catch
块?如果是,怎么做?
- 这段代码有效吗?
您不需要声明 NoSuchElementException
,因为它不是 checked 异常(它是运行时异常,如 NPE)。
调用时不需要try catch块,因为unchecked exception不需要catch。
代码在找到 Bar
后立即返回,但如果循环结束但没有找到,则会抛出异常。
备选实施:
Bar findLast(List stuff) {
return stuff.stream().filter(o -> o instanceof Bar).findFirst().orElseThrow(NoSuchElementException::new);
}
要求:从不同对象的列表中找到最后一个Bar对象,如果找不到则抛出NoSuchElementException
Bar findLast(List stuff) throws NoSuchElementException { }
我的解决方案:
Bar findLast(List stuff) throws NoSuchElementException {
Bar bar = new Bar();
for(int i=stuff.size()-1;i>=0;i--){
if(stuff.get(i).getClass().isInstance(bar)){
return (Bar) stuff.get(i);
}
}
throw new NoSuchElementException();
}
问题:
- 我们需要方法头中的
throws NoSuchElementException
吗? - 在方法的最后一行是否需要
try catch
块?如果是,怎么做? - 这段代码有效吗?
您不需要声明 NoSuchElementException
,因为它不是 checked 异常(它是运行时异常,如 NPE)。
调用时不需要try catch块,因为unchecked exception不需要catch。
代码在找到 Bar
后立即返回,但如果循环结束但没有找到,则会抛出异常。
备选实施:
Bar findLast(List stuff) {
return stuff.stream().filter(o -> o instanceof Bar).findFirst().orElseThrow(NoSuchElementException::new);
}