异常处理
面试题常问:运行时异常和非运行时异常的区别?
运行异常:运行时异常是不可查异常,不需要进行显式的捕捉。这些异常一般是由程序逻辑错误引起的。
我们常见的5中运行时异常:
- ClassCastException(类转换异常)
- IndexOutOfBoundsException(数组越界)
- NullPointerException(空指针)
- ArrayStoreException(数据存储异常,操作数组时类型不一致)
- 还有IO操作的BufferOverflowException异常
非运行时异常:是可查异常,必须进行显式的捕捉,或者抛出(对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过)。
常见非运行异常有:
- NoSuchMethodException:方法未找到异常
- IOException:输入输出异常
- EOFException:文件已结束一场
- FileNotFoundException:文件未找到异常
- NumberFormatException:字符串转换为数字异常
- SQLException:操作数据库异常
Java 语言如何进行异常处理,关键字:throws、throw、try、 catch、finally分别如何使用?
Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java 中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java 的异常处理是通过5 个关键词来实现的:try、catch、throw、throws和finally。一般情况下是try来执行一段程序,如果出现异常,系统会抛出(throw)一个异常,这时候你可以通过它的类型来捕(catch)它,或后(finally)由缺省处理器来处理;try用来指定一块预防所有“异常”的程序;catch子句紧跟在try块后面,用来指定你想要捕捉的“异常”的类型;throw语句用来明确地抛出一个“异常”;throws用来标明一个成员函数可能抛出的各种“异常”;finally为确保一段代码不管发生什么“异常”都被执行一段代码;可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try 语句,“异常”的框架就放到栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,栈就会展开,直到遇到有处理这种“异常”的try 语句。
Java 异常处理try-catch-finally的执行过程
try-catch-finally程序块的执行流程以及执行结果比较复杂。
- 程序首先会运行可能发生的异常try语句块。
- 如果没有发生异常则执行完成后,直接跳到finally语句块执行。
- 如果出现异常,则将根据出现的异常类型跳到相应的catch语句块中执行。
- catch语句块可以有多个,用来处理不同类型的异常类型。比如:多异常捕获。
try{
//可能发生异常额语句块
}catch(异常类型 e){
//异常处理语句块和返回
}catch(异常类型 e){
//异常处理语句块和返回
}
或
try{
//可能发生异常额语句块
}catch(异常类型1 | 异常类型2 e){
if(e instanceof 异常类型1){
//异常处理语句块和返回
}
if(e instanceof 异常类型2){
//异常处理语句块和返回
}
}
- catch执行完,会继续执行finally语句块。
finally是可选的,无论有没有发生异常,finally语句块都会执行的