1.Java中的两种异常类型以及区别:
- Throwable是所有异常的根,Error是错误,Exception是异常
1.1 Exception:
- 一般分为Checked异常(受检查异常)和Runtime异常(运行时异常),所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException
- Checked异常:对Checked异常处理方法有两种:一是当前方法知道如何处理该异常,则用try…catch块来处理该异常。二是当前方法不知道如何处理,则在定义该方法是声明抛出该异常。否则编译不会通过,我们比较熟悉的Checked异常有Java.lang.ClassNotFoundException,Java.lang.NoSuchMetodException, java.io.IOException
- RuntimeException: 编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止,Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。我们比较熟悉的RumtimeException类的子类有Java.lang.ArithmeticException,Java.lang.IndexOutOfBoundsException,Java.lang.NullPointerException
1.2 Error:
- 当程序发生不可控的错误时,通常做法是通知用户并中止程序的执行。与异常不同的是Error及其子类的对象不应被抛出。
- Error是throwable的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。
- Error由Java虚拟机生成并抛出,包括动态链接失败,虚拟机错误,系统崩溃,内存空间不足等。程序对其不做处理。
2. 异常处理完成后,Exception对象会发生什么变化:
- 异常处理对象在异常处理完后,没有引用指向它,变成了不可达对象. 它将在接下来JVM进行gc操作时被标记为"不可达", 如果该Exception实例实现了finalize方法,那么就会安排到F-queue队列中等待执行finalize方法(但是由于F-queue所在线程的优先级很低,所以可能一直得不到执行,而长时间留在该队列中); 再下一次执行gc时,如果Exception对象已经执行完成finalize方法,它将被回收(彻底抹去内存中的数据).
3. finally代码块和finalize() 方法有什么区别:
- 无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。