1、Exception和Error有什么区别?
首先Exception和Error都是继承于Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception和Error体现了JAVA语言对于异常处理的两种方式。
Exception是java程序运行中可预料的异常情况,可以获取到这种异常,并且对这种异常进行业务外的处理。
Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。
其中的Exception又分为已检查异常和未检查异常。两个根本的区别在于:已检查异常必须在编写代码时使用try catch捕获或throws声明抛出,未检查异常在代码编写时可以忽略捕获操作,这种异常是在代码编写或者使用过程中通过规范可以避免发生的。 切记,Error是Throwable,不是Exception 。
Java语言规范将派生于Error类和RuntimeException类的所有异常称为未检查异常(unchecked exception),所有其他的异常称为已检查异常(checked exception)。已检查异常并不是编程错误,它的出现是软件运行阶段所不可避免的,最常见的这类异常如socket连接超时,FileNotFoundException、InterruptException、ClassNotFoundException等等。Java编译器会检查已检查异常,当程序中出现已检查异常,要么用try-catch语句捕获处理,要么使用throws语句声明抛出它,否则编译不通过。
2、throw和throws的区别
throw语句用在方法体内,表示抛出异常(已检查异常),由方法体内的语句处理,处理的方式有两种:要么使用try-catch捕获异常,在方法体内部自己处理,要么使用throws声明抛出这个异常,交给调用者处理(也可以将try-catch与throws结合使用)。throw表示抛出了异常,如果执行throw语句,则一定抛出了某种异常。
throws语句用在方法头,声明该方法可能会抛出这种类型的异常,由该方法的调用者来处理。throws表示出现异常的一种可能性,并不一定会发生这些异常。
throw与throws可以不同时使用。
1.若在方法体中使用throw抛出一个未检查异常,在该方法头可以不用throws声明异常;
2.若在方法体中使用throw抛出一个已检查异常,且用try-catch捕获处理,在该方法头可以不用throws声明异常;
3.若在方法体中使用throw抛出一个已检查异常,且没用try-catch捕获处理,在该方法头必须使用throws声明异常。
4.若一个方法用throws声明异常,在该方法体内可以不用throw抛出异常。
FileNotFoundException是已检查异常,要么使用try-catch捕获异常,在方法体内部自己处理,要么使用throws声明抛出这个异常,交给调用者处理。同样的,EOFException也是已检查异常。
NullPointerException是未检查异常,即使使用throw抛出了未检查异常,若没有使用try-catch进行捕获处理,或者没有使用throws声明异常,也不会有错误提示。因为java编译器不会对未检查异常进行编译检查,只会对已检查异常进行编译检查。同样的,ClassCastException、ArrayIndexOutOfBoundsException、IllegalArgumentException等都是未检查异常。
3、try-catch-finally
1.try-catch-finally 中哪个部分可以省略?
使用try语句的方式有三种:try-catch、try-finally、try-catch-finally,可以省略catch,或者省略finally,但是catch与finally不能同时省略。
2.try-catch-finally 中,如果catch中return了,finally还会执行吗?
不管有无异常,只要存在finally,那么finally均会执行,且finally中有return时,会返回finally中return的值。若try或catch中有return而finally中没有return时,finally是在return之后执行的,只是会把try或catch中return的值先保存起来,等到finally执行结束,才真正的返回。