Java异常处理流程:
(1)Java中可以处理的异常全部都是在程序运行中产生的异常,当程序运行到某行代码并且此代码执行出现异常时,会由JVM帮助用户去判断此异常的类型,并且自动进行指定类型的异常类对象实例化处理。
(2)如果此时程序中并没有提供异常处理的支持,,则会采用JVM默认异常处理方式,首先进行异常信息的打印;其次直接退出当前的程序。
(3)如果此时程序中存在异常处理,那么这个产生的异常类的实例化对象将会被try语句所捕获。
(4)try捕获到异常之后与其匹配的catch中的异常类型依次进行对比,如果此时与catch中的捕获异常类型相同,则认为应该使用此catch进行异常处理;如果不匹配则继续匹配后续的catch类型;如果没有任何的catch匹配成功,那么就表示该异常无法进行处理。
(5)不管异常是否进行处理最终都要执行finally语句,但是执行完成finally的程序后会进一步判断当前的异常是否已经处理了,如果处理过了,则继续向后执行其他代码;如果没有处理则交由JVM进行默认处理。
异常的格式组合:try...catch; try...catch...finally; try...finally
所有的异常都是使用Exception来进行处理。
面试题:为什么不用Throwable?
答:Throwable表示的范围比Exception大。
实际上程序如果使用Throwable来进行处理,没有任何的语法问题,但却会存在逻辑问题。因为此时出现的(或者说用户能够处理的)只有Exception类型,而如果使用Throwable接收,那么还会表示可以处理Error的错误,而用户是处理不了Error错误的,所以在开发中用户可以处理的异常都要求使用Exception类为主。
throw与throws关键字有什么区别?
throw:是在代码块中使用的,主要是受到进行异常对象的输出。
throws:是在方法定义中使用,表示此方法中可能产生的异常明确告诉给调用处,由调用处进行处理。
RuntimeException和Exception的区别?
RuntimeException是Exception的子类。
Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性地处理。
常见的RuntimeException:NumberFormatException、ClassCastException、NullPointException、ArithmeticException、ArrayIndexOutOfBoundsException。