------- android培训、java培训、期待与您交流! ----------
异常的处理:
Java提供了特有的语句进行处理:
try{
//需要被检测的代码;
}catch(异常类 变量){
//处理异常的代码;(处理方式)
}finally{
//一定会执行的语句;
}
对捕获的异常进行常见的方法操作:
class ExceptionDemo{ public static void main(String[] args){ Demo d = new Demo(); try{ int x = d.div(4,0); System.out.println(“x=”+x); } catch(Exception e){//Exception e = new ArithmeticException(); System.out.println(e.getMessage());// 异常信息 System.out.println(e.toString());//异常名称 : 异常信息 e.printStackTrace();//打印堆栈中的跟踪信息。(异常名称,异常信息,异常出现的位置),其实jvm默认的异常处理机制,就是在调用printStackTrace()方法。 } } }
throws:
class Demo { int div(int a,int b) throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。 { return a/b; } }
对多异常的处理:
声明异常时,建议声明更为具体的异常。这样处理的可以更具体:
class Demo{ int div(int a,int b) throws Arithmetic Exception,ArrayIndexOutOfBoundsException{ int[] arr = new int[a]; System.out.println(arr[4]); return a/b; } } class ExceptionDemo1{ public static void main(String[] args){ Demo d = new Demo(); try{ int x = d.div(4,0); System.out.println(“x=”+x); }catch (ArithmeticException e){ System.out.println(e.toString()); }catch (ArrayIndexOutOfBoundsException e){//根据捕捉到的不同异常,进入相对应的catch块内执行处理操作。声明了几个异常,就对应几个catch块, System.out.println(e.toString()); }catch(Exception e){ //如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。不要定义多余的catch块。 } } }
建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrack();,也不要简单的就书写一条输出语句。
自定义异常:
因为项目中会出现特有的问题,而这些问题并未被java锁描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装。
(注:自定义异常只能手动抛出)
例:
需求:在本程序中,对于除数是负数,也视为是错误的是无法进行运算的,那么就需要对这个问题进行自定义的描述。
class FuShuException extends Exception{//定义一个异常类 super(“出现了除数是负数的情况”);//定义自定义异常信息
//因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类,
//通过super语句,那么就可以直接通过getMessage方法获取自定义信息了。 } class Demo{ int div(int a,int b){ if(b<0){ throw new FuShuException();//手动通过throw关键字抛出一个自定义异常对象。 } } }
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都需要被抛出,他们都具备可抛性。这个可抛性是Throwable这个体系中的独有特点。只有这个体系中的类和对象才可以被throws和throw操作。
throws和throw的区别:
1、 throws使用在函数上;throw使用在函数内。
2、 throws后面跟的是异常类,可以跟多个。用逗号隔开;throw后跟的是异常对象。
RuntimeException:
Exception中有一个特殊的子类异常RuntimeException,
如果在函数内部抛出该异常,在函数上不用声明。
如果在函数上声明了该异常,调用者可以不用进行处理。
之所以不用再函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
自定义异常时:如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException。
对于异常分两种:
1, 编译时被检测的异常。
2, 编译时不被检测的异常(运行时异常。RuntimeException及其子类。)
finally:
finally中存放的是一定会被执行的代码。
finally中只有一种情况不会被执行,就是catch块中存在System.exit(0);语句,结束了jvm。
异常在子父类覆盖中的体现:
1, 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能跑哦出父类的异常或者该异常的子类。
2, 如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3, 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。