JAVA异常处理之try、catch、finally

it2023-04-10  74

1.try、catch、finally用法总结:

1)不管有没有异常,finally中的代码都会执行 2)当try、catch中有return时,finally中的代码依然会继续执行 3)finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的 4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值

2.关于执行顺序问题

1)

public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(test()); } public static int test(){ int i = 1; try{ i++; System.out.println("try block, i = "+i); }catch(Exception e){ i ++; System.out.println("catch block i = "+i); }finally{ i = 10; System.out.println("finally block i = "+i); } return i; } /*结果输出如下: try block, i = 2 finally block i = 10 10 */   //先执行try块,并没有捕获到异常,finally块,最后return。

2)把return放到try块中和catch块中,会怎么样呢?先return呢还是先finally呢?返回值i会改变吗?

public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(test()); } public static int test(){ int i = 1; try{ i++; System.out.println("try block, i = "+i); return i; }catch(Exception e){ i ++; System.out.println("catch block i = "+i); return i; }finally{ i = 10; System.out.println("finally block i = "+i); } } /* 结果输出如下: try block, i = 2 finally block i = 10 2 */

可以得出: ①当try、catch中有return时,finally中的代码依然会继续执行。 ②finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。

3)如果是操作不是基本类型会怎么样?会不一样吗?为什么?

public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(test().mmp("fuck")); } public static Person test(){ Person person = new Person(); try{ person.setShengao("172cm"+"---try block"); System.out.println("try block"); return person; }catch(Exception e){ person.setTizhong("100kg"); System.out.println("catch block"); return person; }finally{ person.setXingbie("女"); System.out.println("finally block "); } } package xyz; public class Person { public String shengao; public String tizhong; public String xingbie; //public String hello(String input); public String getShengao() { return shengao; } public void setShengao(String shengao) { this.shengao = shengao; } public String getTizhong() { return tizhong; } public void setTizhong(String tizhong) { this.tizhong = tizhong; } public String getXingbie() { return xingbie; } public void setXingbie(String xingbie) { this.xingbie = xingbie; } public String mmp(String fuck){ System.out.println("person : mmp"); System.out.println("shengao:"+this.shengao); System.out.println("tizhong:"+this.tizhong); System.out.println("xingbie:"+this.xingbie); return fuck; } } /* 结果输出如下: 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代码块不能正常完成。

转自try、catch、finally用法总结

最新回复(0)