前段时间去参加了一场面试,面试过程中提到了一个问题,问的是在try{}finally{}语句块中,如果finally里面包含有return,并且在try中也同样包含一个return的情况下,程序将如何执行?
当时我的回答是,程序将运行try语句块,遇到return时跳过return并直接执行finally语句块,从finally语句块中return。
回来以后和身边的几个朋友聊天聊到这个事情,只是小伙伴们表示并不能理解,因为在常规的思维里面,一个函数的执行单反是遇到了return关键字,就代表程序将在这个地方结束整个函数的运行。
我想稍微说一下的是,这种想法是没有问题的,但是finally语句块的意思就是,当你需要结束try语句块的时候必须要执行finally语句块。也就是说,无论你是正常的执行完了try,还是try执行到一半return出的语句块,在离开语句块之前一定要先进到finally中执行finally的语句。
想象一下你再家里,你家有两个门(两个return),一扇在厨房边(try),一扇在客厅里(finally),你再每次出门的时候都要先拿上客厅里的钥匙才出门。
现在的情况大概就是,你在厨房喝了牛奶,然后想出门了,你自然的会找离你最近的那个门出去,但是在出去之前你想到你还需要带上你的钥匙,于是你来到客厅拿上钥匙,这时候再出去时离你最近的门已经变成了客厅里的门,所以你最优的选择应该是从客厅的门出去而不是回到厨房从厨房的门出去。
这个逻辑就和代码的执行逻辑比较相似,当程序执行到try中的return时,程序知道该要结束函数了,然而结束函数的前提是执行finally,于是在运行try的return之前,程序先来到了finally里面,然而在finally执行过程中,程序有一次遇到了return,这次就没有其他语句块需要跳转了,于是程序将直接返回出去。
也就是说,当你的finally块中已经存在了return的情况下,无论你在try中写入几个return,无论你想怎么return,都是执行不到的。