设为首页 加入收藏

TOP

Java异常处理机制详述
2018-01-01 06:06:57 】 浏览:218
Tags:Java 异常 处理 机制 详述

JAVA中的异常类都继承自Throwable类,也就是说,这是异常类的根。Throwable类扩展了两个类Error类和Exception类,Exception类又扩展了一个RuntimeException类。如下图:



一般来说,出现RuntimeException异常表示的是代码不合理而出现的问题。


因此,在自定义异常类型时,大多数都直接继承Exception类,偶尔可能继承RuntimeException类,更偶尔的可能会继承这些类的某些子类。


使用try-catch结构捕捉异常,并设置捕捉到后的处理方式。还可以加上finally结构,这是可选结构,但却表示try结构中必须会被执行的部分。


以下是try-catch-finally结构和处理过程的分析。


前提假设,在各代码中没有return子句。执行过程为:首先代码1正常执行,到代码2处抛出异常名2的异常,通过异常名匹配,将选择第二个catch结构,于是将异常2封装到对象名e中,并执行代码5处理异常。catch部分处理完后,还有最后处理段finally,于是执行代码6。出了finally后,还将执行代码7。


注意,当代码2出现异常后,代码3不会执行。而finally则是无论是否真的捕捉到了异常、是否在catch段有return都会执行的代码段。换句话说,finally段的代码除了内部错误或外界影响都一定会执行就像下面的例子中,即使catch使用了return,但finally还是会执行,只不过这个catch终止了try结构外的代码。


例如,除数为0时会抛出ArithmeticException异常。try-catch捕捉它:


在finally段中还可以继续try-catch-finally,防止该段落的代码再次抛出异常。


java中的异常都会封装到对象中。异常对象中有几个方法:


throw关键字用于在某个语句处抛出一个异常,只要执行到这个语句就表示必定抛出异常。
throws关键字用于在方法处抛出一个或多个异常,这表示执行这个方法可能会抛出异常。


对于Exception类(非RuntimeException)的异常即已检查异常类,在调用时要么进行捕捉,要么继续向上级抛出。这类错误产生和处理的过程为:


以下是抛出异常的一个简单示例,抛出的是ArithmeticException异常,因为是RuntimeException类异常,因此从方法体内部throw抛出后,无需在方法定义处使用throws继续抛出。


执行结果:


所以,对于RuntimeException类异常来说,是否使用throws关键字??无影响。一般来说,Exception类异常但非RuntimeException才需要使用throws关键字,因为Exception类异常必须要被捕获并处理,而RuntimeException异常则无所谓。


例如将上面的ArimeticException改为FileNotFoundException,前者为Runtime类异常,而后者为Exception但非Runtime类异常,因此使用throw抛出后,必须在定义方法处也使用throws抛出错误。这一过程是"向上级抛出"的过程:"方法体内部抛出异常-->抛给方法本身"


如果不使用throws关键字抛出错误,则将报错:


从方法f()抛出向上抛出给调用者后,调用者要么使用try-catch捕捉,要么继续向上抛出,否则报错。例如捕捉


如果不捕捉,则可以继续在方法处向上抛出:


throw可以同时定义可能抛出的多种异常,尽管这些异常存在继承关系。这时在捕捉异常时,应该先捕捉子类,再捕捉父类。


例如FileNotFoundException是IOException的子类,可以同时:


捕捉时应先捕捉FileNotFoundException,再IOException。


在重写有throws子句的方法时,需要注意:


所以下面的定义中,前子类1-3重写和子类5-7都是有效的,但子类4重写是错误的。


异常是类,当产生异常时会构建此类的异常对象。


自定义异常时需要考虑异常类的构造方法是否接参数,参数需要如何处理实现怎样的逻辑。


自定义的异常一般都从Exception继承。


例如下面定义了一个银行卡存、取钱时的程序,其中自定义了一个Exception类错误。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java数组基础 下一篇Java显示目录文件列表和删除目录

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目