知识点:
1.异常的产生以及对于程序的影响;
2.异常处理的格式;
3.异常的处理流程;
4.Throw,throws关键字的使用;
5.异常处理的使用标准;
6.自定义异常.
异常的描述:
异常是导致程序终端的一种指令刘,如果异常没有进行合理处理的话,会导致程序终端执 行
一旦出现异常,产生异常以后的语句不再执行
异常处理可以使程序即使出现了异常,也可以让程序正常的执行完毕
处理异常格式:
Java提供了三个关键字 try catch finally
try{
//有异常的代码
}catch(异常类型 对象){
//异常处理
}catch(异常类型 对象){
//异常处理
}catch(异常类型 对象){
//异常处理
}finally{
//不管是否出现异常,都执行的统一代码
}
对于以上的操作组合:try...catch,try...catch...finally,try...finally(不建议使用)
使用异常处理,即使程序中出现了异常,也可以正常执行
出现异常的目的是解决异常,所以为了能够进行异常的处理,可以使用异常类中提供的printStackTrace()方法进行异常信息的输出.
异常处理范例:
public class Test{
public static void main(String[] args) {
System.out.println("算术运算开始");
try{
System.out.println(10/0);
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("不管是否有异常我都会执行");
}
System.out.println("算术运算结束");
}
}
异常处理流程(核心,带面试题)
以java.lang.ArithmeticException为例查看继承架构:
java.lang.ArithmeticException
所有的异常类都是Throwable的子类,Throwable下有两个子类
面试题:请解释Error和Exception的区别?
Error:指的是JVM错误,即:此时的程序没有执行,用户不能执行
Exception:指的程序运行中产生的异常,用户可以处理
也就是说所谓的异常处理指的是所有的Exception以及它的子类异常
面试题:请解释java中的异常处理流程
1.当程序在运行过程中出现了异常后,那么会由jvm自动根据异常的类型实例化一个与之匹配的异常类对象;
2.产生了异常对象之后,会判断当前的语句上是否存在有异常处理,如果没有异常处理,那么就交给JVM进行默认的异常处理,处理的方式:输出异常信息.而后结束程序的执行;
3.如果此时存在有异常的捕获操作,那么会由try语句来捕获产生的异常类实例化对象,而后与try以后的每一个catch语句进行比较,如果有符合的catch捕获类型,则使用当前的catch语句来进行异常的处理,如果不符合就继续向下匹配后面的catch;
4.不管最后异常处理是否能够匹配,那么都要向后执行,如果此时程序中存在有finally语句,如果有,就先执行finally语句,但是执行完毕后需要根据之前的catch匹配结果来决定如何执行,如果之前有匹配到catch语句,那么就继续执行finally之后的代码,如果之前没有匹配到相应的catch语句.那么就将此异常交给jvm处理,输出异常信息,结束程序执行
整个过程就好比方法重载一样,catch就好比方法名,根据catch后的参数进行类型匹配,但是所有java对象都存在有自动的向上转型的操作支持,如果说真的要匹配类型,简单的做法就是匹配Exception就够了
两点说明:
1.在编写多个catch捕获异常的时候,捕获范围大的异常一定要放在捕获异常范围小的后,否则程序编译报错
2.虽然直接捕获Exception比较方便,但是这样也不好,因为所有的异常都会按照同样一种方式进行处理;一些要求严格的项目里面,异常一定要分开处理.
throws关键字
throws关键字主要用于方法声明上,指的是当方法之中出现异常后交由被调用处处理
也就说调用了具有throws声明的方法之后,不管操作是否出现异常,都必须使用try...catch来进行异常处理
在主方法上如果继续抛出异常,那么这个异常就交给JVM进行处理,也就是采用默认的处理方式,输出异常信息,而后结束程序调用
主方法上不要加上throws,因为程序如果出错了,也希望能够正常执行.
throw关键字
在程序中可以使用throw手动抛出异常
面试题:请解释throw和throws的区别
throw:指的是在方法之中人为抛出一个异常类对象(这个异常类对象可能是自己实例化,或者抛出已经存在的)
throws:在方法的声明上使用,表示此方法在调用时必须处理异常,可以声明多个
RuntimeException类 运行时异常
这种异常类的最大特征在于:程序在编译的时候不会强制性的要求用户处理异常,用户可以根据自己的需要选择性的处理异常,如果用户没有处理,产生异常了,将交给JVA处理,也就是说RuntimeException的子异常类.用户可以根据情况处理
面试题:请解释Exceprion与RuntimeException的区别?请列举出几个你常见的RuntimeException
1.Exception是RuntimeException的父类;
2.使用过Exception定义的异常必须要被处理,而RuntimeException的异常可以选择性处理;
常见的RuntimeException:ArithmeticException,NullPointerException, ClassCastException
自定义异常
自定义异常类可以继承Exception(强制处理异常)或者RuntimeException(选择性处理异常
class AddException extends Exception{
public AddException(String msg){
super(msg);
}
})