Java程序的执行过程中如出现了异常,会自动生成一个异常类对象,该异常将被提交给Java运行时环境,这个过程称为抛出(throw)异常。
当Java运行时环境接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
如果Java运行时环境找不到可以捕获异常的方法,则运行时环境将终止,相应的Java程序也将退出。如果能捕获,程序将顺序执行;
程序通常只能处理异常(Exception),而对错误(Error)无能为力。
Try-catch-finally处理异常:
如果Java应用程序发生异常未得到处理,那么,程序将会在控制台(如果启动的话)输出一条包含异常类型以及异常堆栈内容的信息;如果是非图形化的应用程序,程序将中止,图形化的则不会。
当try从句或者catch()从句中有System.exit()语句时,finally()不会被执行;否则无论try-catch中是否出现异常(包括异常是否被处理),是否有return语句等,finally()总是要执行的。
①try-catch型。当try抛出了由catch指定的异常,则代码在抛出异常处中止,到相应的catch()中执行。
如果只有try-finally,那么在try中遇到异常时,Java先去执行finally,如果finally里没有异常出现,那么执行完finally后,程序会再回去处理try中的异常;如果finally中有异常,那么,不管finally中的异常的范围比try中的大还是小,都会将try中的异常覆盖。
如果在catch中也抛出了异常,同样,程序会去检测finally中是否有异常,如果有的话,finally中的异常也会覆盖catch中的异常。
②通过catch来捕获多个异常时,子类异常在前,父类异常在后;如果try中也抛出了异常,那么其范围不能超出catch中的异常的范围。
③如果try,catch,finally中都有return语句,那么finally中的return将覆盖try-catch中的return语句。
如果finally中有return ,break,continue,System.exit()时,将会中断未处理的异常,直接退出程序。
如果只有try或者catch中有return,而finally中没有,则这些return和没有效果一样。
不允许在return语句后面抛出异常或者书写代码,否则编译出错。
④try-catch-finally相互嵌套时,先处理最内层的try-catch-finally
Throws抛出异常。在定义方法时可以将异常抛出,让调用这个方法的代码处理。
Catch中可以通过throw来抛出自己不能处理的异常。
方法覆盖时的异常处理:
①覆盖方法的异常,可以抛出与被覆盖方法的相同的异常或者被覆盖方法的异常的子类 的异常。
②如果父类的方法没有声明抛出异常,那么子类覆盖方法不可以声明抛出“已检查”异常(可以抛出“未检查异常”);所谓“未检查”是指Error的子类和RuntimeException的子类(数学计算异常、数组越界异常、空指针异常等),这里面的“未”字意思是编译时不报错,系统只能在运行时才能判断是否出错;其它的异常均称为“已检查”异常,在编译时就会报错的那些异常。
③如果父类的方法声明抛出异常(包括自定义的异常),那么子类覆盖方法可以不声明抛出异常,但是,如果子类覆盖方法要抛的话,只能抛出与被覆盖方法的相同的异常或者被覆盖方法的异常的子类 的异常,不能是其它的“已检查”异常。