异常
方式一:由开发者通过if-else来解决异常问题
方式2:开发者不需要通过if-else来解决异常问题,而是Java提供异常处理机制。
它将异常处理代码和和业务代码分离,使程序更优雅,更好的容错性,高键壮性。
异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述
try - catch 中catch如何处理异常:
异常类型:
try-catch-finally
在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行
通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。
finally块中语句不执行的唯一情况:
finally块的具体执行过程:
Error
Error类层次描述了Java运行时系统内部错误和资源耗尽错误,一般指与JVM或动态加载等相关的问题,如虚拟机错误,动态链接失败,系统崩溃等。
这类错误是我们无法控制的,同时也是非常罕见的错误。所以在编程中,不去处理这类错误。
打开JDK包:java.lang.Error,查看他的所有子类
注:我们不需要管理Error!
Exception
所有异常类的父类,其子类对应了各种各样可能出现的异常事件。
Exception分类
1.运行时异常Runtime Exception(unchecked Exception)
2.检查异常 Checked Exception
声明异常throws
当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去。
如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。
子类声明的异常范围不能超过父类声明范围
手动抛出异常throw
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要手工创建并抛出。
在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做,也可以由JRE来实现,但是他们调用的都是throw子句。
注意抛出运行时异常和Checked异常的区别 :
抛出Checked异常,该throw语句要么处于try块中,要么方法签名中是由throws抛出 抛出运行时异常,没有以上要求
自定义异常
在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类
从Exception类或者它的子类派生一个子类即可
习惯上,定义的类应该包含2个构造器:一个是默认构造器,另一个是带有详细信息的构造器
使用场合举例
在分层结构中,将底层原始异常直接传递给用户是不太好的
解决方案:异常转译
异常转译也称为异常链