try、catch、finally用法總結:
1、不管有沒有異常,finally中的代碼都會執行
2、當try、catch中有return時,finally中的代碼依然會繼續執行
3、finally是在return后面的表達式運算之后執行的,此時並沒有返回運算之后的值,而是把值保存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
4、finally代碼中最好不要包含return,程序會提前退出,也就是說返回的值不是try或catch中的值
執行順序
1.
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 System.out.println(test());
4 }
5 public static int test(){
6 int i = 1;
7 try{
8 i++;
9 System.out.println("try block, i = "+i);
10 }catch(Exception e){
11 i ++;
12 System.out.println("catch block i = "+i);
13 }finally{
14 i = 10;
15 System.out.println("finally block i = "+i);
16 }
17 return i;
18 }
結果輸出如下:
try block, i = 2
finally block i = 10
10
先執行try塊,並沒有捕獲到異常,finally 塊,最后return。
2.當我們把return放到try塊中和catch塊中,會怎么樣呢?你們會不會糾結先return呢還是先finally呢?返回值i會改變嗎?
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 System.out.println(test());
4 }
5 public static int test(){
6 int i = 1;
7 try{
8 i++;
9 System.out.println("try block, i = "+i);
10 return i;
11 }catch(Exception e){
12 i ++;
13 System.out.println("catch block i = "+i);
14 return i;
15 }finally{
16 i = 10;
17 System.out.println("finally block i = "+i);
18 }
19 }
結果輸出如下:
try block, i = 2
finally block i = 10
2
如我們總結一樣:
2、當try、catch中有return時,finally中的代碼依然會繼續執行
3、finally是在return后面的表達式運算之后執行的,此時並沒有返回運算之后的值,而是把值保存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
3.如果是操作不是基本類型會怎么樣?會不一樣嗎?為什么?
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 System.out.println(test().mmp("fuck"));
4 }
5 public static Person test(){
6 Person person = new Person();
7 try{
8 person.setShengao("172cm"+"---try block");
9 System.out.println("try block");
10 return person;
11 }catch(Exception e){
12 person.setTizhong("100kg");
13 System.out.println("catch block");
14 return person;
15 }finally{
16 person.setXingbie("女");
17 System.out.println("finally block ");
18 }
19 }
Person類
1 package xyz;
2
3 public class Person {
4 public String shengao;
5 public String tizhong;
6 public String xingbie;
7
8 //public String hello(String input);
9
10 public String getShengao() {
11 return shengao;
12 }
13
14 public void setShengao(String shengao) {
15 this.shengao = shengao;
16 }
17
18 public String getTizhong() {
19 return tizhong;
20 }
21
22 public void setTizhong(String tizhong) {
23 this.tizhong = tizhong;
24 }
25
26 public String getXingbie() {
27 return xingbie;
28 }
29
30 public void setXingbie(String xingbie) {
31 this.xingbie = xingbie;
32 }
33
34
35 public String mmp(String fuck){
36 System.out.println("person : mmp");
37 System.out.println("shengao:"+this.shengao);
38 System.out.println("tizhong:"+this.tizhong);
39 System.out.println("xingbie:"+this.xingbie);
40 return fuck;
41 }
42
43 }
結果輸出如下:
try block
finally block
person : mmp
shengao:172cm---try block
tizhong:null
xingbie:女
fuck
從上面可以看出,在finally中的set的性別 女 生效了,而在之前用基本類型,在finally中修改它的值不生效。為什么呢?
我們知道基本類型在棧中存儲,而對於非基本類型是存儲在堆中的,返回的是堆中的地址,因此內容被改變了。
4.如果在finally加入return,會怎么樣? 如果在finally 拋出了異常呢?
在finally中存在return,會有黃色警告:finally block does not complete normally 意思是finally代碼塊不能正常完成。

