黑马程序员技术交流社区
标题:
关于finally里面的执行的问题
[打印本页]
作者:
李挺
时间:
2013-2-21 21:05
标题:
关于finally里面的执行的问题
本帖最后由 李挺 于 2013-2-22 09:12 编辑
复制代码
finally{ // 关闭资源
try {
if(bufi!=null)
bufi.close();
}
catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
finally{
try {
if(bufi!=null)
bufi.close();
}
catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
}
}
复制代码
刚才代码赋值错了抱歉
上面这个代码是关流的时候的操作,编译可以通过,如果
bufi.close();出现了异常,那么下面的那个finally块是不是不执行了?
会出现这个问题么?
作者:
黑马-王言龙
时间:
2013-2-21 21:11
下面那个try块是不会执行;
可能会出现这个问题,小概率事件
作者:
罗海云
时间:
2013-2-21 21:14
肯定不会执行啊...程序一遇到异常就直接停止了.不向下执行了.
作者:
江华
时间:
2013-2-21 21:20
可以规避掉的
使用finally 关键字, 把这个问题规避掉!
finally
{ // 关闭资源
//分级处理问题,这样每个问题都会处理!
try
{
//第一级,测试代码,检查是否有异常。
if(bufi!=null)
bufi.close();
}
catch (IOException e)
{
//发现异常,捕捉异常,并处理第一级异常
throw new RuntimeException("读取关闭失败");
}
finally
{
//执行第二级 ,测试代码,检查异常
try
{
//测试代码块
if(bufo!=null)
bufo.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
//如果后续还有还可以延续,至于这样处理是不是最优化的就不知道了
}
}
复制代码
作者:
许鑫星
时间:
2013-2-21 21:25
{:soso_e103:}这个都会执行吧,异常终止只是针对当前try的块里,io异常捕获后会继续往下执行。。。你可以测试下io异常发生后会不会继续往下执行
public static void main(String[] args) {
try {
throw new IOException();
}catch (IOException e) {
e.printStackTrace();
}
try{
throw new RuntimeException();
}catch(Exception e) {
System.out.println("catch");
}
}
复制代码
作者:
王钊
时间:
2013-2-21 22:35
本帖最后由 王钊 于 2013-2-21 22:48 编辑
会执行,我模拟了下,看这个:
你这个如果关闭流失败,应该只抛出下面那个异常,因为finally肯定要执行,而finally中抛出运行时异常会使程序终止,不能返回执行上面那个catch了!
PS:
在通常情况下,不要在
finally
块中使用如
return
或
throw
等导致方法终止的语句,否则会导致
try
块、
catch
块中的
return
、
throw
语句失效。
pspublic class Test
{
public static void main(String[] args)
{
int[] arr=new int [2];
try
{
System.out.println(arr[3]);//数组角标越界肯定出异常
}
catch (Exception e)
{
throw new RuntimeException("出现异常!(上面)");
}
finally
{
try
{
System.out.println(arr[3]);
}
catch (Exception e2)
{
throw new RuntimeException("出现异常!(下面)");
}
}
//输出结果是:
// Exception in thread "main" java.lang.RuntimeException: 出现异常!(下面)
// at com.forum.test.Test.main(Test.java:26)
}
}
复制代码
作者:
成吉思汗
时间:
2013-2-21 23:00
关于try{}catch(){}finally{}语块:
try{}语块是可能发异常的代码,如果发生异常,则跳到catch语块中,否则不会执行catch语块.
catch(){}语块除非try{}语块中有异常才会被执行到.
finally{}语块是无论如何都要执行的代码块.
那么上述问题中如果bufi.close();出现了异常,是不会影响到finally{}语块中代码的执行的,
所以,finally{}语块中的代码还是会执行的.
作者:
余善航
时间:
2013-2-22 20:30
finally 块中 第一个关闭流资源如果没有出现异常 而第二个关闭流资源出现异常
作者:
江华
时间:
2013-2-22 20:35
无语了!!!
楼主,我对你真是无语了!
昨天,我看楼主的代码还不是这个样子的!
今天怎么就变了???
作者:
李挺
时间:
2013-2-22 20:58
江华 发表于 2013-2-22 20:35
无语了!!!
楼主,我对你真是无语了!
昨天,我看楼主的代码还不是这个样子的!
抱歉,昨天复制错了
作者:
江华
时间:
2013-2-22 21:13
哎!没关系啦!
你的问题找到答案就好,至于技术分给谁了,无所谓了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2