【Java】Java 的异常处理机制

得分点:异常处理、抛出异常、异常跟踪栈

标准回答:
异常处理机制可以让程序具有极好的容错性和健壮性,当程序运行出现了意料之外的状况时,系统会生成一个 Exception 对象来通知程序,从而实现“业务功能实现部分的代码”与“错误处理部分的代码”分离,使程序获得更好的可读性。
Java的异常机制可以分成异常处理、抛出异常和异常跟踪栈问题三个部分。
处理异常的语句由try、catch、finally三部分组成。try块用于包裹业务代码,catch块用于捕获并处理某个类型的异常,finally块则用于回收资源。如果业务代码发生异常,系统就会创建一个异常对象,并将这个异常对象提交给JVM,然后由JVM寻找可以处理这个异常的catch块,并将异常对象交给这个catch块处理。如果JVM没有找到可以处理异常的catch代码块,那么运行环境会终止,Java程序也会退出。若业务代码打开了某项资源,则可以在finally块中关闭这项资源,因为无论是否发生异常,finally块一定会执行(一般情况下)。
当程序出现错误时,系统会自动抛出异常。除此以外,Java也允许程序主动抛出异常。当业务代码中,判断某项错误的条件成立时,可以使用throw关键字向外抛出异常。在这种情况下,如果当前方法不知道该如何处理这个异常,可以在方法签名上通过throws关键字声明抛出异常,则该异常将交给JVM处理。
程序运行时,经常会发生一系列方法调用,从而形成方法调用栈。异常机制会导致异常在这些方法之间传播,而异常传播的顺序与方法的调用相反。异常从发生异常的方法向外传播,首先传给该方法的调用者,再传给上层调用者,以此类推。最终会传到main方法,若依然没有得到处理,则JVM会终止程序,并打印异常跟踪栈的信息。


加分回答:
throw、throws区别
throws:
● 只能在方法签名中使用 - 可以声明抛出多个异常,多个异常之间用逗号隔开
● 表示当前方法不知道如何处理这个异常,这个异常由该方法的调用者处理(如果main方法也不知该怎么处理异常,这个异常就会交给JVM处理,JVM处理异常的方式是,打印异常跟踪栈信息并终止程序运行,这也就是为什么程序遇到异常会自动结束的的原因)
● throws 表示出现异常的一种可能性,并不一定会发生这些异常
throw:
● 表示方法内抛出某种异常对象,throw 语句可以单独使用。
● throw 语句抛出的是一个异常实例,不是一个异常类,而且每次只能抛出一个异常实例
● 执行 throw 一定抛出了某种异常。


关于finally的问题:
当 Java 程序执行 try 块、catch 块 时遇到了 return 或 throw 语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含 finally 块,如果没有 finally 块,程序立即执行 return 或 throw 语句,方法终止;如果有 finally 块,系统立即开始执行 finally 块。只有当 finally 块执行完成后,系统才会再次跳回来执行 try块、catch块里的 return 或 throw 语句;如果 finally 块里也使用了 return 或 throw 等语句,finally 块会终止方法,系统将不会跳回去执行 try 块、catch 块里的任何代码。这将会导致 try 块、catch 块中的 return、throw 语句失效,所以我们应该尽量避免在 finally 块中使用 return 或 throw。
finally 代码块不执行的几种情况:
● 如果当一个线程在执行 try 语句块或者 catch 语句块时被打断 interrupted 或者被终止 killed,与其相对应的 finally 语句块可能不会执行。
● 如果在 try 块或 catch 块中使 System.exit(1); 来退出虚拟机,则 finally 块将失去执行的机会。

猜你喜欢

转载自blog.csdn.net/Your_Boy_Tt/article/details/130390584