标签:owa 抛出异常 gets 业务 资源 捕获异常 形参 接口 cat
异常机制可以使程序中的异常处理代码和政策业务代码分离,保证代码更加优雅,提高程序的健壮性。
java异常分为checked异常和runtime异常。checked异常在编译阶段由编译器处理,告知程序员进行修改。runtime异常无须处理,由异常处理机制捕获。
有try,catch,finally,throw,throws组成。
try catch捕获异常。
执行try块中代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给java运行时环境,这个过程叫做抛出异常。
java运行时环境收到异常对象时,会寻找能处理该异常对象的catch,找到则将该异常对象交给catch块处理,这个过程叫做捕获异常。
如果java运行时环境找不到捕获异常的catch块,则运行时环境终止,java程序退出。
上图是Exception类的所有异常
如果java运行时环境受到异常后,会依次判断该对象是否是catch块后异常类或其子类的实例,如果是,将调用catch块的子类,如果不是则比较下一个catch块。程序会将系统生成的异常对象ex传给catch块的异常形参。从而获得更多信息。
try块以后可以有多个catch块,针对不同的异常类型提供不同的异常处理方式。
一般情况下,catch块只有一个会执行。
try,catch的花括号不能省略,即使只有一行代码。
try中的局部变量在catch中不能访问。
java的所有非正常情况分为两种,exception和error,都继承自throwable类。其中error类指与虚拟机相关问题,如系统崩溃,虚拟机错误,动态链接失败等等。这个是不能捕获的。将导致应用程序中断。
如上图的exception类,注意些catch时,一定要将子异常类写在前面,父异常类写在后面否则子类异常将永远捕获不到异常,因此程序往往将exception类写在最后。
java7以后,一个catch块可以捕获多个异常,多个异常类型之间用|隔开。
捕获多个类型异常时,异常变量隐式final修饰,不能对其赋值。捕获一个异常类型时,则可以。
所有异常对象都包含以下常用方法:
getMessage():返回该异常的详细描述字符串。
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流。
getStackTrace():返回该异常的跟踪栈信息。
使用finally回收资源。
java的垃圾回收机制只会回收堆内存中对象所占用的内存,不会回收任何物理资源(如数据库连接,网络连接,磁盘文件等等)如果在try块里打开一些物理资源,则必须显示回收。
为了回收物理资源,提供了finaly块,不管try中是否异常,或者那个catch执行,甚至在try中有retrun语句,finally也都会执行。但是如果是用system..exit(1)则退出虚拟机,finally将不会得到执行。
异常处理语法,try是必须有的,catch和finally是可选的,但是二者必须有一个。finally永远是放在最后的。
不要在finally中使用return,throw等导致方法终止的语句。这会造成try,catch中的return,trhow失效。
因为程序时按照 先执行try,catch,如果其中有return或者throw,则向下寻找finally,如果没有则执行return或者throw,如果有,则先执行finally,如果此时finally中没有return和throw,则执行完之后再去执行try和catch中的throw和return,如果finally中有这两个词,则执行完return或者throw后,将终止方法,不会跳去执行try,catch中的任何代码。
可以在try,catch,finally中嵌套异常处理代码。通常不超过两层。
java7,将程序结束后必须关闭的资源,写在try后的括号里声明或者初始化这些资源。,这样,就不用再finally中关闭。但是这些资源必须实现AutoCloseable或者closeable接口。后者是前者的字即可,后者里声明了IOexception,前者只声明了Exception。因此后者的实现类里只用IOexception。
java9不需要在圆括号里声明或初始化创建资源。只需要自动关闭的资源有final或者有效的final修饰即可。只要不对某个变量赋值,就是有效的final,即使没有声明final。
标签:owa 抛出异常 gets 业务 资源 捕获异常 形参 接口 cat
原文地址:https://www.cnblogs.com/tomato190/p/12401565.html