场景1不走catch
try {
return 1
} catch (E: Exception) {
return 2
} finally {
return 3
}
先执行try然后执行finally,最终返回3
场景2走catch
try {
throw RuntimeException()
return 1
} catch (E: Exception) {
return 2
} finally {
return 3
}
执行catch然后执行finally,最终返回3
场景3有变量值更改-不走catch
//x传入2
fun testFinally(x: Int): Int {
var y = x
try {
y = y + 1
// throw RuntimeException()
return y
} catch (E: Exception) {
y = y + 2
return y
} finally {
y = y + 3
return y
}
}
先走try,y值变为3,然后执行finally,y值变为6,方法返回6
场景4有变量值更改走catch
//x传入2
fun testFinally(x: Int): Int {
var y = x
try {
y = y + 1
throw RuntimeException()
return y
} catch (E: Exception) {
y = y + 2
return y
} finally {
y = y + 3
return y
}
}
先走try,y值变为3,然后执行catch y值变为5,最后执行finally,y值变为8,方法返回8
场景5有变量值更改走catch,但是finally没有return
//x传入2
fun testFinally(x: Int): Int {
var y = x
try {
y = y + 1
throw RuntimeException()
return y
} catch (E: Exception) {
y = y + 2
return y
} finally {
y = y + 3
}
}
先走try,y值变为3,然后执行catch y值变为5,最后执行finally,y值变为8,但是方法返回值是5
结论:finally肯定会走(除非是System.exit()),不管有没有rerun。且有变量值时会保存上一步骤的改变