关于Java中异常处理部分,面试时经常会被问到 「Exception与Error有什么区别?」,建议重点关注。
Exception与Error有什么区别?
问题分析:既然问到两者的区别,说明两者是有必然联系的,故简单从两者的联系说起,重点突出两者的区别,最后可选择性的介绍Exception的体系结构。
参考答案:
联系:Exception和Error都继承于Throwable类,在Java中只有Throwable类的实例才可被抛出或者捕获,故可将Throwable类看做Java中异常与错误处理的核心。
区别:Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题,比如内存溢出,不可能指望程序能处理这样的情况。而Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
常见的Error主要包括:
- OutOfMemoryError:内存溢出错误
- StackOverflowError:栈溢出错误
- VirtualMachineError:虚拟机错误
- NoClassDefFoundError:找不到类错误
PS:关于Exception的体系结构见下一问题。
谈谈你对Java中Exception类的理解?
问题分析:主要从编译时异常和运行时异常两个方面进行解释。
参考答案:
Exception类作为Java中异常处理机制的基本组成类型,其主要分为编译时异常和运行时异常。
编译时异常也叫可检查异常,指编译器要求必须处置的异常,即编译时异常不是说有异常才处理,而是在编译前对可能出现的异常隐患进行提示并要求处理。
运行时异常也叫不检查异常,指编译器不要求强制处置的异常,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。
总而言之,对于运行时异常来说,可以不显式地进行处理;而对于编译时异常来说,必须要显式地进行处理。
常见的运行时异常有哪些?
参考答案:
- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)
扩展面试题
问:如下代码块的返回值是什么?
public static int WithException() {
int i = 10;
try {
i = i / 0;
return --i;
} catch (Exception e) {
--i;
return --i;
} finally {
--i;
return --i;
}
}
答:6。因为finally代码块的存在,try和catch中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,但由于finally中有return语句,故直接从finally代码块中直接返回。(不太好理解,大家可以debug看一下)
推荐阅读
欢迎关注
Java名企面试吧,每天10点24分,我们不见不散!
丙子先生的宗旨是,每天以短篇幅讲高频面试题,不增加太多负担,但需要持之以恒。
能力有限,欢迎指教!