经典面试题: 程序执行结果是100; (一):final和finally和finalize的区别
# finally异常处理 # 代码 import sys import time f = None try: f = open("poem.txt") # 我们常用的文件阅读风格...You cancelled the reading from the file.") finally: # 始终执行 if f: f.close() print("(Cleaning
{ System.out.println("i in finally - from try or catch block is--" + i); --i...- from try or catch block is--8 i in finally block is--7 返回:6 如果改为下面(最后的return语句): public class Main...- from try or catch block is--8 i in finally block is--7 返回:8 总结: 1、finally语句中没有return时,执行完try或catch...语句的return之后还会执行finally。...(而return的值会暂存在栈里面,等待finally执行后再返回) 2、finally语句中有return时,依然会执行try或catch语句的return,但是最终返回的是finally语句中的
无论try语句中是否抛出异常,finally中的语句一定会被执行。...由于finally的这个特性,finally经常被用来做一些清理工作。...所以在上面的例子中,func1() 中,在try块return之前,会执行finally中的语句,try中的return被忽略了,最终返回的值是finally中return的值。...类型的,try中抛出的异常没有被捕获到,所以except中的语句没有被执行,但不论异常有没有被捕获,finally还是会执行,最终函数返回了finally中的返回值3。...try中抛出的异常没有被捕获到,按理说当finally执行完毕后,应该被再次抛出,但finally里执行了return,导致异常被丢失。 可以看到在finally中使用return会导致很多问题。
When---什么时候需要finally: 在jdk1.7之前,所有涉及到I/O的相关操作,我们都会用到finally,以保证流在最后的正常关闭。...这时候我们就可以将A放入finally块中。很常见的一个操作就是锁的unlock操作。 What---什么是finally: 字面解释就是最终,eventually。...How---如何使用finally: finally块必须配合try块使用,而不能单独使用。...Deeper---深入探究finally块: 在深入探究之前我们直接先给出四个结论: 1. finally块只会在try块执行的情况下才执行 2. finally块在离开try块执行完成后或者try块未执行完成但是接下来是控制转移语句时...那么在finally块执行之前,存储在本地变量中的只是对象引用的值,而不是对象的深拷贝。我们可以在finally块中对返回对象的属性进行改变。
try语句有一个可选finally子句,用于定义在所有情况下都必须执行的finally操作try: raise KeyboardInterruptfinally: print('Goodbye...,则该finally子句将作为try语句完成之前的最后一项任务执行。...如果finally子句包含一条return语句,则该finally子句的return语句将在子句中的return语句之前执行,所以事实上执行了的是finally...finally:......finally:...
try代码块完成之后,自动调用close方法,相当于在finally里主动调用。但是出现异常后的流程和try finally有什么不同呢? 下面写代码测试一下。...); } } 我们的这个Cat有以下特点: sayHello方法会抛出异常 close方法也会抛出异常 test v1: 'try(Cat cat = new Cat())' VS 'try finally...外层捕获的是在finally执行close时抛出的异常,sayHello的异常完全不见了。...test v2: 'try(Cat cat = new Cat()) catch{}' VS 'try catch finally' 有catch,并且catch里再抛出异常 static void...先走catch,再走finally,所以catch捕获的是sayHello的异常 catch中再次抛出的异常不见了,外层捕获的是在finally执行close时抛出的异常。
不知道大家有没有问过自己,finally方法会在什么时候不执行呢?那我们下面来看看finally到底会不会不执行。...1.finally的含义 finally的真正含义是指从try代码块出来才一定会执行相应的finally代码块。...()中止虚拟机, finally代码块不会被执行。...所以,如果守护线程中存在finally代码块,那么当所有的非守护线程中止时,守护线程被kill掉,其finally代码块是不会执行的。...而且,即使其进入了try代码块,finally代码块也不会被执行。 总结 finally代码块并非一定执行,在不进入try代码块或者程序被中止时就不会执行。
finally: 是对Java异常处理模型的最佳补充,在异常处理时提供finally块来执行任何清除操作。finally代码块总会被执行,无论是否有异常发生。
} 3. try{ //逻辑代码 }finally{ //一定要执行的代码 } try { //执行的代码,其中可能有异常。...return ,可以理解为只要执行了try或者catch,就一定会执行 finally } 其实这些都还好理解,主要就是finally中的代码执行顺序的问题,这里给出我的想法: 正常情况下...,先执行try里面的代码,捕获到异常后执行catch中的代码,最后执行finally中代码,但当在try catch中执行到return时,要判断finally中的代码是否执行,如果没有,应先执行finally...... catch... finally... return value of getValue(): 0 意思就是在try 和catch中如果要return,会先去执行finally中的内容再返回。...当在try中要return的时候,判断是否有finally代码,如果有,先执行finally,所以直接return 1.
本文主要讨论finally的用法。 try...finally的用处是无论是否发生异常都要确保资源释放代码的执行。...如下从几个细节讨论finally的特性。...(by gashero)从这里可以看出,只要程序没有突然终止,则finally中的资源释放语句一定会执行。无论发生什么异常都会执行到finally语句块中的代码。 2、finally之后呢?...实际测试看来,finally之后,try语句块中抛出的异常并没有被处理,而是直接被抛出到try...finally语句块之外了。并且是在finally语句块执行之后继续抛出这个异常的。...3、如果希望直接finally掉呢? 有些时候在处理了finally中的资源释放之后就不再需要继续处理抛出的异常了,在这种情况下可以考虑在finally语句块中使用return语句。
异常中的finally finally的功能和用法 功能 无论是否发生异常 , 一定会执行的代码块 在函数中, 即便在try或except中进行了return也依然会执行finally语法块 try语法至少要伴随...except或finally中的一个 用法 try: except: finally: 历史 在python 2.5 之前的版本, finally...except Exception as e: print('111') return e finally: print('finally')...: print('2finally') return 'finally' print('========') result = test5() print(result...# print('i am finally') return 'i am finally' print('-------') result = test6() print(result
前言 catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。...Finally finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。...注意:如果没有catch语句块,那么finally块就是必须的。 ...而在finally之后的部分才是真正的return,它试图取出我们所保存的第二个局部变量压栈,将它作为返回值。...但对于引用类型来说,它与先前所操作的引用所指的是同一对象,因此finally块中的操作会影响到返回值,也就非常好理解了。
final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是大相径庭。这一次我们就一起来回顾一下这方面的知识。...} //静态final变量不能在构造器中初始化 public static final int E; public FianlTest(){ E = 50; } } finally...:在异常处理的时候,提供finally块来执行任何的清除操作。...如果抛出一个异常,那么相匹配的catch字句就会执行,然后控制就会进入finally块,前提是有finally块。...NullPointerException(); }catch(NullPointerException e){ System.out.println("程序抛出了异常"); }finally
版本Java 8finally 中的陷阱我们知道无论是否发生异常还是 try 或 catch 中存在 return,finally 都会执行,下面我们来看看下面几种场景:finally 中使用 return...当我们在 finally 中使用 return 时,try 或 catch 中的 return 会失效或异常丢失(见下文),会在 finally 直接返回。...中直接 return -1 java.lang.ArithmeticException: / by zerothis is finally-1 finally 中修改数据的影响如果你在 finally...finally 代码块一定会执行?...总结本文我们结合了 finally 在实际使用中可能出现的问题并进行分析对应的原因,最后介绍了 finally 在 JVM 中的实现原理,帮助我们在日常开发的更好的使用 finally,下篇文章将会介绍实际异常处理中的一些最佳实践
try { return "try"; } catch (Exception e) { return "cache"; } finally...{ System.out.println("finally"); } } public static String testTry2() {...try { return "try"; } catch (Exception e) { return "cache"; } finally...try ===testTry2=== finally cache ===testTry3=== finally 结论: 1、根据testTry1,testTry2结果可知,当try/catch块中有return...声明时,finally块中的代码依旧执行 2、根据testTry3结果可知,try/catch return的值会被finally中return的值覆盖
} finally { //一定会被执行的语句。 } try:该代码块中编写可能产生异常的代码。 catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。...finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。...而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。...catch (ArithmeticException ex){ //进行异常处理 System.out.println("异常处理"); }finally
前些天有朋友在微信群里问了一个比较有意思的问题: try/catch/finally语句块的finally和return谁先执行呢?...也即是我们在try内部调用return,然后finally内部又去修改return返回的内容会怎么样呢?...这时候大家可能会认为return执行完之后,finally就没有执行了,要知道finally定义是无论什么情况都会最后执行finally语句。...那么是不是由于int类型返回的时候直接返回值,那么finally内部再加的话也是无效的呢?...这个结果证明是即使是调用了return,finally也会执行。
} catch (Exception e) { System.out.print("B"); throw new Exception("2"); } finally...我以为因为finally子句始终会执行,因此在抛出Exception("3");的时候将catch中的异常覆盖了,今天突然又想起来到底catch中的异常是否还存在呢,搜了一下,csdn上飞天金刚给出了一个分析...IllegalArgumentException e) { System.out.println("c"); throw new UnsupportedOperationException("3"); }finally
定论 问:finally语句一定会执行吗? 答: 如果没有执行相应的try语句则不会执行。 在try语句中如果调用System.exit(0)方法则不会执行。 问:finally会在什么时候执行?...总结 finally与return之间的关系 如果在finally中含有return语句,那么try/catch语句的return还有作用吗?...即finally操作后的数据存储到其他槽中,而后再加载try/catch操作后的数据。 而在finally中含有return时,栈中最后存储的数据是finally中操作后的数据。...即finally操作后的数据存储到其他槽中,而后加载的是其他槽(finally)中的数据。...也就是说:如果finally中不含有return语句,finally对try/catch操作的八大基础类型不会再加载到操作数栈中。 如果返回值是对象引用,finally中的return还有待考据。
领取专属 10元无门槛券
手把手带您无忧上云