双向链表Iterator.next()方法能否不使用局部变量实现?
实现方案
直接使用try-finally结构即可完全去掉局部变量,逻辑和你原有实现完全等价:
/** Return the next element to enumerate. */ public @Override E next() throws NoSuchElementException { if (!hasNext()) throw new NoSuchElementException(); try { return n.val; } finally { n = n.succ; } }
原理解释
Java中try-finally的执行顺序为:
- 先执行
try块内的代码,对return后的表达式n.val完成求值,确定最终返回值 - 执行
finally块内的赋值操作,将n指向后续节点n.succ - 方法返回之前已经求值完成的
n.val
这种写法完全规避了你提到的NPE问题:hasNext()校验已经保证进入方法时n一定是非空的,返回值求值完成后才会修改n的指向,哪怕n.succ为null,也不会再访问修改后n的任何属性,不会出现空指针。
内容的提问来源于stack exchange,提问作者James E
相关产品推荐
相关产品推荐

