从对象列表中查找最后一个对象,如果找不到则抛出异常

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();
    }

问题:

  1. 我们需要方法头中的 throws NoSuchElementException 吗?
  2. 在方法的最后一行是否需要 try catch 块?如果是,怎么做?
  3. 这段代码有效吗?

您不需要声明 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);
}