异常的处理:JAVA提供了特有的语句进行处理
固定格式:
try{ 需要被检测的代码}catch(异常类 变量){ 处理异常的代码}finally{ 一定会执行的语句}
class eDemo{ int div(int a,int b){ return a/b; }}class ExceptionDemo{ public static void main(String[] args){ eDemo d=new eDemo(); try{ int x=d.div(4,0); //检测代码 System.out.println("x="+x); } catch(Exception e){ //处理发生异常的代码 System.out.println("none"); //Exception e=new ArithmeticException(); } finally{ //处理结束 System.out.println("over"); } }}
对找到异常对象的常见方法操作
1.String getMessage();获取异常信息 printStackTrace();获取异常名称,异常信息,出现位置
2.在函数上声明异常,变鱼提高安全性,让调用处进行处理,不处理会编译失败
class eDemo{ int div(int a,int b)throws Exception{ //通过throw关键字声明该功能有可能出现异常 return a/b; }}class ExceptionDemo{ public static void main(String[] args)throws Exception{
对多异常的处理
1.声明异常时,建议声明更为具体的异常,这样可以处理的更具体
2.对方声明几个异常,就对应有几个catch块,不要定义多余的catch块
如果多个catch块中的异常出现继承关系,父类catch块放在最下面
throws ArithmeticException,ArrayIndexOutOfBoundsException//声明算术异常,数组越界异常
**建立在进行catch处理时,catch中一定要定义具体的处理方式
自定义异常
因为项目中会出现特有的问题,而这些问题并未被JAVA所描述并封装对象
因此对于这些特有的问题,可以按照JAVA对问题的封装思想
将特有的问题进行自定义的异常封装
eg. v1.0
/* 需求:在本程序中,对于除数是0或-1视为错误,无法进行运算 */ class fushuException extends Exception{ } class fDemo{ int div(int a,int b){ if(b<0){ throw new fushuException(); //手动通过throw关键字抛出自定义异常对象 } return a/b; } } class ExceptionDemo2{ public static void main(String[] args){ fDemo f=new fDemo(); int x=f.div(4,-1); System.out.println("x="+x); System.out.println("over"); } }/*无法编译:ExceptionDemo2.java:10: 错误: 未报告的异常错误fushuException; 必须对其进行捕获或声明以便抛出 throw new fushuException(); //手动通过throw关键字抛出自定义异常对象*/
当函数内部出现了throw抛出异常对象,那么就必须要有对应的处理动作
要么在内部try/catch处理|||||要么在函数上声明让调用者处理
一般情况下,函数内部出现异常,函数上需要声明
v2.0
/* 需求:在本程序中,对于除数是0或-1视为错误,无法进行运算 */ class fushuException extends Exception{ //创建异常对象 } class fDemo{ int div(int a,int b)throws fushuException{ //声明异常 if(b<0){ throw new fushuException(); //手动通过throw关键字抛出自定义异常对象 } return a/b; } } class ExceptionDemo2{ public static void main(String[] args){ fDemo f=new fDemo(); try{ //函数内对异常进行处理 int x=f.div(4,-1); System.out.println("x="+x); } catch(fushuException e){ System.out.println(e.toString()); System.out.println("出现负数"); } System.out.println("over"); } }
打印的结果中只有异常的名称,没有异常的信息,需要自定义异常信息
ver3.0
/* 需求:在本程序中,对于除数是0或-1视为错误,无法进行运算 */ class fushuException extends Exception{ //创建异常对象 /*private String msg; fushuException(String msg){ //复写父类获取信息方法 this.msg=msg; } public String getMessage(){ return msg; }*/ /*fushuException(String msg){ //直接调用父类方法,将子类异常信息传给父类 super(msg); }*/ private int value; //自定义异常信息 fushuException(String msg,int value){ super(msg); this.value=value; } public int getValue(){ return value; } } class fDemo{ int div(int a,int b)throws fushuException{ //声明异常 if(b<0){ throw new fushuException("除数为负数",b); //手动通过throw关键字抛出自定义异常对象 } return a/b; } } class ExceptionDemo2{ public static void main(String[] args){ fDemo f=new fDemo(); try{ //函数内对异常进行处理 int x=f.div(4,-1); System.out.println("x="+x); } catch(fushuException e){ System.out.println(e.toString()); System.out.println("出现负数"); System.out.println("错误的负数是"+e.getValue()); } System.out.println("over"); } }
**自定义异常必须是自定义类继承Exception
继承Exception的原因:异常类和异常对象都被抛出。
他们都具备可抛性,这个可抛性是Throwable中的独有特点
只有这个体系中的类和对象才可以被throws/throw操作
throw与thorws的区别
throws使用在函数上 throw使用在函数内
throws可以跟多个异常类,用逗号隔开
throw后跟异常对象