说明:其中内容摘自:《Java程序员面试宝典》,这里仅供学习使用。
1. finally块中的代码什么时候被执行?
Java的异常处理中,finally块的作用就是保证无论出现什么情况,finally块中的代码都会被执行。所以无论在try或catch中return,finally中的代码会在return之前执行。如果finally中有return语句,则会覆盖上面所有的return语句。
那么finally块是否一定会被执行?不一定。
- 程序在try语句块之前就出现异常,程序会立即结束。
- 程序在try块中强制退出(System.exit(0);)。
2. 异常处理的原理是什么?
异常是指程序运行时(非编译时)所发生的的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。异常处理的目的为:提高程序的安全性和鲁棒性。
Java将异常当做对象来处理,并定义了一个基类(java.lang.Throwable)作为所有异常的父类,这些异常类分为Error和Exception两大类。
违法语义检查包括两种情况:
- 一种是Java类库内置的语义检查。
- 一种是Java允许开发人员扩展这种语义检查,创建自己的异常类。
3. 运行时异常和普通异常有什么区别?
Java提供了两种错误的异常类,分别为Error和Exception,他们共同的父类为Throwable。
(1)Error表示程序在运行期间出现了非常严重的错误,并且该错误是不可恢复的,属于JVM层次的错误,这种错误会导致程序终止执行。此外,编译器不会检查Error是否被处理,因此在程序中不推荐去捕获Error类型的异常。
(2)Exception比表示为可恢复的异常,是编译器可以捕获的。包含两种类型:检查异常(checked exception)和运行时异常(runtime exception)。
检查异常(不是运行时异常的其他异常都是检查异常),例如SQL异常和IO异常。Java编译器强制程序去捕获这种类型的异常,即把可能会出现的这些异常方法try块中,把对异常的处理放到catch块中。这种异常一般在如下情况中使用:
- 异常的发生不会导致程序出错,进行处理后可以继续执行后续的操作。
- 程序依赖于不可靠的外部条件,例如系统IO。
运行时异常,编译器不强制捕获这种异常。当出现这种异常时由JVM进行处理,常见的运行时异常包括:
- NullPointerException
- ClassCastException
- ArrayIndexOutOfBoundException
- ArrayStoreException(数组存储异常)
- BufferOverflowException(缓冲区溢出异常)
- ArithmeticException(算术异常)等