参考Java程序员面试笔试宝典:
目录
1.finally块中的代码什么时候被执行
在java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。
任何语句要执行都只能在return前执行(除非遇到exit函数),因此fianlly块里的代码也是在return前执行。
当finally块里有return语句,将会覆盖函数中其他return语句。
由于方法内部定义的变量都存储在栈中,当函数结束,对应栈会被回收,方法体内定义的变量就不存在了,因此return返回时不是直接返回变量的值,而是复制一份,然后返回。因此对基本数据类型,在finally块里改变return值对返回值没有影响,而对引用类型的数据会有影响。
引申:
问:出现在finally块的代码是不是一定会被执行?
答:不是。当程序进入try语句之前就出现异常,会直接结束,不会执行finally块里的代码;当程序在try块中强制退出时也不会执行,如System.exit(0)
2.异常处理的原则是什么
异常是指程序运行时(非编译时)发生的非正常情况或错误,当程序违反了语义规则时,JVM就会讲其作为一个异常并抛出。这个异常在catch中进行捕获,然后进行处理。
java把异常当成对象来处理,定义了一个基类(java.lang.Throwable)作为所有异常的父类。Java API中定义了很多异常类,分为Error(错误)和Exception(异常)两大类。
违反语义规则包括两种情况,一是java类库内置的语义检查,如数组越界和访问null对象;二是允许java开发人员扩展语义检查,创建自己的异常类,并自由选择在何时用throw关键字抛出异常。
3.运行时异常和普通异常有什么区别
Java提供两种错误的异常类,分别为Error和Exception,有相同父类——Throwable
Error表示程序运行期间出现了非常严重的错误,且不可恢复,会导致程序终止执行。此外,编译器不会检查Error是否被处理,不推荐去捕获Error类型的异常。当这些异常发生时,JVM一般会选择将线程终止。
Exception表示可恢复的异常,编译器可以捕捉到的。它包含两种类型:检查异常(checked exception)和运行时异常(runtime exception)
检查异常:最经常碰到的异常。所有继承自Exception并且不是运行时异常的异常都是检查异常,如IO异常和SQL异常。这种异常发生在编译阶段,把可能出现异常的代码放到try块中,对异常的处理放到catch中。这种异常一般在几种情况中使用:1)异常不会导致程序出错,进行处理可以继续执行后续操作,如数据库连接失败进行重连。2)程序依赖不可靠的外部条件,如系统IO
运行时异常:不同于检查异常,编译器没有强制对其进行捕获处理。如果不对其处理,当出现这种异常,会由JVM来处理,如NullPointException异常,就是运行时异常。
常见的运行时异常:空指针异常、类型转换异常、数组越界异常、数组存储异常、缓冲区溢出异常、算术异常等。
出现运行时异常后,会不断往上层抛出,直到遇到处理代码为之。若没有处理块,则抛到最上层;多线程用Thread.run()方法抛出,单线程用main()方法抛出。若不对运行时异常处理,后果严重,要么线程中止,要么主程序终止。
注意:
1)java异常处理用到了多态的概念,应该先捕获子类,再捕获基类。
2)尽早抛出异常,并进行处理,或从错误中恢复,或让程序继续执行。
3)可根据实际需求自定义异常类,继承Exception类即可。
4)异常能处理就处理,不能处理就抛出。