1、没运行到try-catch语句这里就返回了。
1)在try语句之前,方法就有返回值,返回了,未执行到try语句。
int method{return 1; //直接返回,运行不到try语句try{}finally{}
}
2)在运行到try语句之前,方法出错了,程序就崩溃了。如: i = i / 0; //抛出异常,未执行到try语句块
int method{int num = 1/0; //出错,程序终止,运行不到try语句try{}finally{}
}
2、运行到try-catch语句了,但是没运行到finally代码块的时候,JVM就停止了
1)停电、关机、硬件崩溃的时间刚好在运行try和finally之间的时候
2)在try语句运行的时候,直接把虚拟机退出了,如it(0); //系统退出,未执行到finally语句块
int method{int num = 1; it();return num; //不允许,因为上面的语句已经把JVM停止了,那么finally自然也不运行}finally{}
}
除此之外,程序中的finally必然运行!!!
finally就是在try备份好返回值的时候运行的。
总的顺序就是:try(如果有返回值)备份数据------->finally-------->(如果try有返回值)返回数据 -------->(如果程序仍要继续)后面的代码
也就是说不管try语句中有什么内容,finally语句一定会执行,哪怕是有返回值,也会在返回值返回之前把finally代码块执行了!
返回值是基本数据类型时,try备份的返回值是数据本身,finally代码块里无法对返回数据进行修改。
int num = 1;
try{return num;}finally{num = 2;}//无法修改num的值,返回值仍然是1
返回值是引用数据类型时,try备份的是数据的地址值,fially可以通过地址值对数据进行修改。try返回地址值后,再通过这个地址去调用数据,数据就变成被finally修改过的了。
String str = "123";try{return str; //备份好str的地址值后,就去执行finally,然后才返回出去
}finally{str = "456"; //通过地址值去修改数据
}//可以修改数据,return的地址值对应的数据是"456"
执行到finally的代码块时,如果有return,那么这就相当于一个出口,数据会在finally这里直接返回出去。
哪怕try或者catch已经备份好了数据(或者数据地址值),那也不再运行try-catch里的return语句。
try{return 1; //这里备份好数据,准备返回
}finally{return 2; //这里直接返回2,哪怕try已经准备好返回1,也不再运行,程序结束。
}//注意:这里特意使用的基本数据类型,就是为了表明不是对数据的修改(因为没法修改),而是返回了另一个数据。
本文发布于:2024-02-02 01:31:32,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681299840539.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |