问题描述:
1 | 求问如下代码的输出结果? |
相信有点技术内涵的面试者都知道面试官在考察 finally 的点。
但看似简单的一道题,其实可考察的的技术细节很多,可以说是一道很好的面试题。
虽说这道题看似不难,可能基础好的面试者给出的答案为 i = 0, 可能还有些面试者给出的答案为 i = 1(显然这个是肯定错误的答案), 可能还有些面试者给出的答案是 编译错误。
那答案到底是 i = 0 还是 编译错误的呢? 当然就要看面试官考察的点了,其实将上述这段代码在 IDE 中敲一下,的确会报错误,因为 getI() 方法没有全覆盖的返回值,不知道是面试官本身不行,还是故意为之,这就不得而知了。
不过即使不知道面试官的真正意图,但面试者如果在面试时足够镇静,还是可以给出一个完美的答案的。
比如:面试官你好,这道题我觉得可以分情况考虑,一,如果单从代码来看,这段代码会编译错误,因为 catch 语句块中没有 return, getI() 方法是不完整的;二,如果 catch 中加上 return 语句后,我认为答案是 i = 0。
这样回答,既不用担心完全拿不准面试官要考察的点,还能让面试官认识到你 思维缜密, 基础扎实, 心理素质过硬, 难道 这些不都是面试中的加分项吗?
最后,说一下为什么在没有编译错误的情况下输出结果中 i 的值为 0:因为在 try-catch-finally 语句块中,先执行 try 中 return i; 语句,此时会将 i 的值写入栈中返回,然后在执行 finally 中语句。
总结
此题考查的知识点:
- try-catch-finally 语法的理解
- return时,结果入栈
- 函数的完整性(这是最容易被面试者忽略的,其实除了 try-catch-finally 语句块中会出现这种问题外,if-else 语句块中同样可能会出现)