异常处理(Java9)

Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字。

try…catch:

如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时的环境,这个过程被称为抛出(throw)异常。
当Java运行时环境受到异常对象时,会寻找该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给该catch块处理,这个过程被称为捕获(catch)异常;如果Java运行时环境找不到捕获该异常的catch块,则运行时环境终止,Java程序也将退出。

如果try块被执行一次,则try块后只有一个catch块会被执行,绝不可能有多个catch块被执行。

try块里申明的变量是代码块内局部变量,它只在try块内有效,在catch块中不能访问该变量。

进行异常捕获是所有父类异常的catch块都应该排在子类异常catch块后面(简称:先处理小异常,再处理大异常),否则将出现编译错误。

多异常捕获:

捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。
捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。

访问异常信息:

当Java运行时决定调用某个catch块来处理异常对象时,会将异常对象赋给catch块后的异常参数,程序即可通过该参数来获得异常的相关信息。

finally:

ps:

Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用内存。

不管try块内的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块总会被执行。

异常处理语法结构中只有try块是必需的,也就是说,如果没有try块,则不能有后面的catch块和finally块;catch块和finally块都是可选的;但catch块和finally块至少出现其中之一。

如果在异常处理代码中使用System.exit(1)语句来退出虚拟机,则finally块将失去执行机会。

在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,一旦在finally块中使用了return或throw语句,将会导致try块、catch块中的return、throw语句失效。只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的return或throw语句。

异常处理的嵌套:

异常处理流程代码可以放在任何能放可执行代码的地方。

自动关闭资源的try:

try关键字后紧跟一对圆括号,圆括号可以申明、初始化一个或多个资源,此处的资源指的是那些必须在程序结束时显示关闭的资源(比如数据库连接、网络连接),try语句在该语句结束时自动关闭这些资源。为了保证try语句可以正常关闭资源,这些资源实现类必须实现AutoCloseable或Closeable接口,实现这两个接口就必须实现close()方法。
Java7几乎把所有的资源类(包括文件IO的各种类、JDBC编程的Connection、Statement等接口)进行了改写,改写后资源类都实现了AutoCloseable或Closeable接口。
Java9不要求在try后的圆括号内声明并创建资源,只需要自动关闭的资源有final修饰或者是有效的final(effectibely final),Java9允许将资源变量放在try后非圆括号内。

throws:

throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。

一旦使用throws 语句声明抛出该异常,程序就无须使用try…catch块来捕获该异常了。

如果某段代码中调用了一个带throws声明的方法,该方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常。

方法重写时声明抛出异常的限制:

子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。

throw:

如果需要在程序中自行抛出异常,则使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。

自定义异常类:

定义异常类时通常需要提供两个构造器:一个无参数的构造器;另一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的描述信息(也就是异常对象的getMessage()方法的返回值)。

catch和throw同时使用:

为了实现通过多个方法协作处理同一个异常的情形,可以在catch块中结合throw语句来完成。
PS:
企业级应用对异常的处理通常分成两个部分:
1.应用后台需要通过日志来记录异常发生的详细情况;2.应用还需要根据异常向应用使用者传达某种提示。在这种情况下,所有异常都需要两个方法共同完成,也就必须将catch和throw结合使用。

Java7增强的throw语句:

Java编译器会检查throw语句抛出异常的实际类型。

异常链:

JDK1.4以后,所有Throwable的子类在构造器中都可以接收一个cause对象来作为参数。这个cause就用来表示原始异常,这样可以把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,你也能通过这个异常链追踪到异常最初发生的位置。

异常处理规则:

成功的异常处理应该实现如下四个目标:
使程序代码混乱最小化。
捕获并保留诊断信息。
通知合适人员。
采用合适的方式结束异常活动。

对于普通的错误,应该编写处理这种错误的代码,增加程序的健壮性。只有对外部的、不确定的和预知的运行时错误在使用异常。
不要使用过于庞大的try块。

避免使用Catch All语句。

对异常采取适当的措施:

处理异常。
重新抛出异常。
在合适的层处理异常。’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值