你真的了解Java引入异常机制的作用么?

前两天腾讯面试官问了我这样一个问题,为什么java要引入异常处理机制,让程序崩溃不是很不友好么?我之前也没思考过这个问题,临场发挥,想了想给出了这么一个回答:“发生了异常,说明程序已经发生错误了,如果不及时处理异常,错误将会方法,发生不可预期的损失,最好就是在源头掐灭它,而让程序崩溃也是无可奈何的事情,相比较损失,崩溃APP可能会让损失小点”。面试过后,我回头总结这次面试的时候又想起了这个点,觉得我可能对异常还有模糊的地方,于是又进行了一次异常学习。在此总结归纳下,本文不是讲异常基础,是我对异常的理解,所以不会写太多异常基础基础,默认你对异常有了一定理解

引文

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时要么任程序自生自灭,立刻退出终止,要么输出错误信息给用户?让用户来处理?显然,两者都不太好,立刻终止有违用户体验,输出错误信息给用户太扯淡,加深了用户对产品的使用难度,用户根本不知道或者有些不理解你所输出的错误。所以java为此引入了更好的机制,那便是java异常处理机制,捕获这个可能发生的异常,让程序员来处理。此类异常在java中归为运行时异常,java的异常机制不止运行时异常,这里只分析运行时异常。

案例1

 public static void main(String[] args) {  
            int a = 7;  
            int b = 0;  
            try { // try监控区域,此区域发生的异常都将被catch捕获  

                if (b == 0) throw new ArithmeticException(); 
                System.out.println("a/b的值是:" + a / b);  
            }  
            catch (ArithmeticException e) { 
                System.out.println("程序出现异常,变量b不能为0。");  
            }  
            System.out.println("程序正常结束。");  
        }  

打印信息:

程序出现异常,变量b不能为0。
程序正常结束。

上面这个案例很好的说明了,java机制的作用,程序员在预测此段代码可能发生错误,如果发生了不可预期的错误,就是if中为true就将其抛出,然后被catch捕获,然后在其中,你可以做发生异常后的处理,或者其他等等一系列处理,处理好后,程序就会认为你错误修好了,继续执行后面的代码。相反的是如果没有这种机制,那么发生异常了只能崩溃程序。

案例2
if(true) {
    throw new Exception("数组越界异常"); 
}
System.out.println("抛出异常后"); 

打印信息:

Exception in thread "main" java.lang.Exception: 数组越界异常
    at p2.test2.main(test2.java:10)

很显然,你只抛出异常,没打算处理,那么程序认为已经发生错误了,没人处理这个错误,那么只能把程序终止了,避免可能发生的更大的或者未知的错误。你在写这行代码的时候就会注意到其实打印这行语句的旁边就有个警告信息,提示了你后面的将无法执行。要注意的是Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。所以上述代码中我们在public static void main(String[] args) throws Exception 加入了抛出声明。

对于案例2思考

结合案例2,为什么抛出异常后我不处理就崩溃程序?在java中发生了什么?
运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。所谓的异常处理器就是你自己对异常的处理,即try-catch

总结

java为什么引入异常机制,也是结合了在java出现之前的语言对异常处理的不当之处吧,正是异常机制,让用java语言编写出来的程序更加健壮,不会被轻易就“击垮”,平时的编码中善用异常处理机制可以让程序更健壮,及时对可能发生的异常捕获并处理。运行时异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

猜你喜欢

转载自blog.csdn.net/HJsir/article/details/80612790