Java异常概念以及不同异常的处理

JAVA异常类型结构

Throwable是所有异常的基类。Throwable的下一层有两个分类:ErrorException
在这里插入图片描述
一、异常概念
Error 和 Exeption

	1、Error
	Error描述了JAVA程序运行时系统的内部错误,通常比较严重,除了通知用户和尽力使应用程序安全地终止之外,其余事情无能为力。程序中不应该尝试去捕捉这种异常。通常为一些虚拟机异常,如StackOverflowError (堆栈溢出错误)。
	2、Exception
	Exception类型下面有两个分支:一个分支派生自RuntimeException,这种异常通常是程序错误导致的异常;另一个分支为非派生自RuntimeException的异常,这种异常通常是程序本身没有问题,由于像I/O错误等问题导致的异常。

受查异常和非受查异常

	1、受查异常
	受查异常会在编译时被检测。如果一个方法中的代码会抛出受查异常,则该方法必须包含异常处理,即try-catch代码块,或者在方法签名中使用throws关键字声明该方法可能会抛出的受查异常,否则编译无法通过。如果一个方法中可能抛出多个受查异常类型,就必须在方法的签名处列出所有的异常类。(示例代码就不写了,只要写过代码的同学都应该知道如何写)。
	2、非受查异常
	非受查异常不会在编译时被检测。JAVA中Error和RuntimeException类的子类属于非受查异常,除此之外继承自Exception的类型为受查异常。

二、异常处理
1、 异常抛出

    (1)、直接抛出
    通常,应该捕捉那些知道如何处理的异常,将不知道如何处理的异常继续传递下去,传递异常可以在方法签名处使用**throws**关键字声明可能会抛出的异常。
    (2)、封装异常再抛出
    有时我们会从catch中抛出一个异常,目的是为了改变异常的类型,多用于在多系统集成时,当某个子系统故障,异常类型可能有多种,可以用统一的异常类型向外暴露,不需暴露太多内部异常细节。

在这里插入图片描述
在这里插入图片描述
异常捕捉

在一个try-catch语句块中可以捕捉多个异常类型,并对不同类型的异常做出不同的处理;在同一个catch也可以捕捉多种类型异常,用 | 隔开

在这里插入图片描述
在这里插入图片描述
自定义异常

习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带详细描述信息的构造函数(Throwable 的 toString 方法会打印这些详细信息,调试时很有用)

在这里插入图片描述
try-catch-finally

	当方法中发生异常,异常处之后的代码不会再执行,如果之前获取了一些本地资源需要释放,则需要在方法正常结束时和 catch 语句中都调用释放本地资源的代码,显得代码比较繁琐,finally 语句可以解决这个问题。
	调用该方法时,读取文件时若发生异常,代码会进入 catch 代码块,之后进入 finally 代码块;若读取文件时未发生异常,则会跳过 catch 代码块直接进入 finally 代码块。所以无论代码中是否发生异常,fianlly 中的代码都会执行。

在这里插入图片描述
若 catch 代码块中包含 return 语句,finally 子句依然会执行。若 finally 中也包含 return 语句,finally 中的 return 会覆盖前面的 return。
上面例子中,finally 中的 close 方法也可能抛出 IOException, 从而覆盖了原始异常。JAVA 7 提供了更优雅的方式来实现资源的自动释放,自动释放的资源需要是实现了 AutoCloseable 接口的类。
在这里插入图片描述
try 代码块退出时,会自动调用 scanner.close 方法,和把 scanner.close 方法放在 finally 代码块中不同的是,若 scanner.close 抛出异常,则会被抑制,抛出的仍然为原始异常。被抑制的异常会由 addSusppressed 方法添加到原来的异常,如果想要获取被抑制的异常列表,可以调用 getSuppressed 方法来获取。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值