异常处理

Posted tomato190

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。

异常机制可以使程序中的异常处理代码和政策业务代码分离,保证代码更加优雅,提高程序的健壮性。

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。

 

以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章

java异常处理详解!!

Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

异常处理,约束,MD5加密,日志处理

PHP异常处理

Java的异常处理语法