- finally不被執(zhí)行情況【僅此一種情況下不執(zhí)行】
- finally中的代碼塊先于return語句執(zhí)行
- finally代碼塊雖然先于return執(zhí)行羹奉,但不能修改return返回的局部變量值
- finally代碼塊中建議不要是用return語句。
一蝇摸、finally不被執(zhí)行情況【僅此一種情況下不執(zhí)行】
fun tryCatch1() {
try {
exitProcess(0)
} catch (e: Exception) {
} finally {
println("Finally is running.")
}
}
由于先執(zhí)行了exitProcess(0)
終止了程序,自然finally
語句塊不會被執(zhí)行薄扁。
二框弛、finally中的代碼塊先于return語句執(zhí)行
fun tryCatch1(): Int {
try {
return 0
} catch (e: Exception) {
return 1
} finally {
println("Finally is running.")
}
}
fun main() { tryCatch1().also(::print) }
// 運行結(jié)果:
Finally is running.
0
Process finished with exit code 0
fun tryCatch1(): Int {
try {
throw IllegalStateException()
} catch (e: Exception) {
return 1
} finally {
println("Finally is running.")
}
}
fun main() { tryCatch1().also(::println) }
// 運行結(jié)果:
Finally is running.
1
Process finished with exit code 0
finally代碼塊先于 return語句
和 catch代碼塊
執(zhí)行貌踏。
三、finally代碼塊雖然先于return執(zhí)行丧蘸,但不能修改return返回的局部變量值
fun tryCatch1(): Int {
var a = 0
val b = 3
try {
return a + b
} catch (e: Exception) {
return a + b
} finally {
println("Finally is running.")
a = 2
}
}
fun main() { tryCatch1().also(::print) }
// 運行結(jié)果:
Finally is running.
3
Process finished with exit code 0
??finally代碼塊
雖然在return語句
之前執(zhí)行【這里是指在return
返回之前執(zhí)行漂洋,即先執(zhí)行 a+b
,再執(zhí)行finally代碼塊
力喷,再返回刽漂。】,但此時finally代碼塊
不能通過重新給變量賦值的方式改變return語句
的返回值弟孟。
- 下面是一個易錯理解案例贝咙。
data class Person(var name: String)
fun tryCatch1(): Person {
val a = Person("張三")
try {
return a
} catch (e: Exception) {
return a
} finally {
println("Finally is running.")
a.name = "李四"
}
}
fun main() { tryCatch1().also(::print) }
// 運行結(jié)果:
Finally is running.
Person1(name=李四)
Process finished with exit code 0
??這里看似finally
中的代碼影響了return
的返回值,但我們要理解return
實際返回的是什么!!!(地址)
四拂募、finally代碼塊中建議不要是用return語句庭猩。
fun tryCatch1() {
try {
throw IllegalArgumentException()
} catch (e: Exception) {
println("Catch is running.")
throw IllegalArgumentException("Catch throw exception.")
} finally {
return
}
}
fun main() = Unit.also { try { tryCatch1() } catch (e: Exception) { e.message.also(::print) } }
這段代碼我們期望打印出的結(jié)果是:
Catch is running.
Catch throw exception.
但實際運行結(jié)果是這樣的:
Catch is running.
Process finished with exit code 0
這是因為finally代碼塊
先于throw
執(zhí)行,而finally
中已經(jīng)return
没讲,自然導(dǎo)致throw
沒有執(zhí)行的機會眯娱。