Java异常按照异常需要处理的时机分为编译时异常(CheckedException)和运行时异常(RuntimeException)。只有Java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。
对Checked异常处理方法有两种:
1.当前方法知道如何处理该异常,则用try...catch块来处理该异常;
2.当前方法不知道如何处理,则在定义该方法时声明抛出该异常。
运行时异常是只有当代码在运行时才发现的异常,编译时不需要try catch。Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显式声明或捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显式捕获它们。
以上代码在走到第3行的时候遇到了一个MathException,这时第4行代码就不会执行了,代码直接跳转到catch语句中,走到第6行的时候,异常机制有这么一个原则如果在catch中遇到了return或者异常等能使该函数终止的话那么用finally就必须先执行完finally代码块里面的代码然后再返回值。因此代码又调到第8行,可惜第8行是一个return语句,那么这个时候方法就结束了,因此第6行的返回结果就无法被真正返回。如果finally仅仅是处理了一个释放资源的操作,那么该道题最终返回的结果就是2。
因此上面返回值是3。