Java异常-面试必知
1. 什么是Java中的异常?
异常是指程序运行时(非编译时)所发生的非正常情况或错误,
当程序违反了语义规则时,JVM就会将出现的错误表示成一个异常抛出,这个异常可以在catch程序中进行捕获,然后进行处理,异常处理的目的就是为了提高程序的安全性与鲁棒性(鲁棒性就是健壮性,在遇到异常还能正常工作,不至于死机)。
2. 异常的处理原理是什么?
Java语言把异常当作对象来处理,并定义了一个基类(java.lang.Throwable)作为所有异常的父类,Java API中定义了许多异常类,这些异常类分为Error(错误)和Exception(异常)两大类。
3. Error和Exception有什么区别?
Error表示在程序在运行期间出现的非常严重的错误,并且该错误是不可恢复的,由于这属于JVM层次的严重错误,因此这种错误会导致程序终止执行的,运行时异常多是由于逻辑错误导致的,是可以解决的,所以说一个正确的程序是不应该存在Error的,如(OutOfMemoryError 、ThreadDeath)等都属于错误,这些异常发生,JVM一般会选择将线程终止。
Exception表示可以恢复的异常,是编译器可以捕捉到的,它包含两种类型:检查异常(checked exception)和运行时异常(runtime exception)。
4. 检查异常与运行时异常(非检查异常)
检查异常:Java中所有继承 Exception 的类的异常都是检查型异常,发生在编译阶段,编译器强制程序去捕获此类异常,即把可能会出现这些异常的代码放到try块中,把对异常的处理的代码放到catch块中,这种异常一般在如下几种情况下使用:
(1)异常的发生并不会导致程序的错误,进行处理后可继续执行,例如:当数据库连接失败后,可以重新链接后进行操作。
(2)程序依赖不可靠的外部条件,例如系统IO
运行时异常:所有继承RuntimeException 的异常都被称为非检查型异常(运行时异常)。编译器没有强制程序去捕获并处理。出现运行时异常后,系统会把异常一直往上层抛出,知道遇到处理代码为止,如果是多线程就用Thread.run() 方法抛出,抛出之后这个线程也就退出了,如果是单线程,就用main()方法抛出,那么整个策划稿内需也就退出了,所以,如果不对运行时异常就行处理,后果非常严重,一旦发现要么线程终止,要么主程序终止。
5. 常见运行时异常
- 空指针异常
NullPointerException
- 类型强制转换异常
ClassCastException
- 数组越界异常
ArrayIndexOutOfBoundsException
- 数组存储异常(向数组中存放与声明类型不兼容对象异常)
ArrayStoreException
- 缓冲区溢出异常
BufferOverflowException
- 算术异常
ArithmeticException
- 下标越界异常
IndexOutOfBoundsException
FileNotFoundException - 文件未找到异常
SQLException - 操作数据库异常
IOException - 输入输出异常
上面提到检查异常,异常处理放在catch块中,下面我们来介绍一下try-catch-finally-return执行顺序?
6. try-catch-finally-return执行顺序?
在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行,finally块中的代码在return前执行,如果try-finally 或者 catch-finally中都有return,那么finally那么finally块中的return将会覆盖别处的return语句。最终返回调用者那里的是finally中return的值,
出现在Java代码中的finally块有两种情况不会被执行
(1)当程序在进入try语句之前就出现异常时,会直接结束掉。
(2)当程序在try块中强制退出时也不会去执行finally块中的代码。(try中调用System.exit(0))