黑马程序员技术交流社区
标题: Exception和RuntimeException [打印本页]
作者: 黑马_位志国 时间: 2013-3-9 19:36
标题: Exception和RuntimeException
本帖最后由 黑马_位志国 于 2013-3-11 20:59 编辑
为什么Exception及其子类(除了RuntimeException及其子类)在抛出异常时,若不在所在函数体内处理,必须在函数上抛出异常类?
我知道RuntimeException是Exception的子类,但为什么一个要抛出,一个不要抛出?
具体怎样来限制RuntimeException不需要在函数上抛出异常类的?
作者: cyh8807 时间: 2013-3-9 19:40
本帖最后由 赵彦辉 于 2013-3-9 19:44 编辑
异常分类:java.lang.Throwable的两个子类 Error类:该类代表错误,指程序无法恢复的异常,对于所有错误类型及其子类,都不要求程序进行处理。常见的Error类型:如内存溢出 StacOverflowError等
Exception类:该类代表异常,指程序有可能恢复的异常,该类是整个Java语言异常类体系中的父类,使用该类就可以代表所有的异常清理。
在这些异常类中,根据是否程序自身导致的异常,将所有的异常类分为两种:
RuntimeException及其子类
该类属于程序运行时异常,即程序自身的问题所导致的异常。如数组下标越界异常
ArrayIndexOutofBoundsException等,该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现错误。
其他Exception子类
该类异常属于程序外部问题引起的异常,即程序运行时某些外部问题导致产生异常,例如文件不存在异常 FileNotFoundException,该类异常在语法上要求强制出来,如不处理则会出现语法错误。
异常的处理
java的异常处理方式有两种:
1、 try…..cathc…finally结构对异常进行捕获和处理
try
{
//可能抛出的异常代码
}
catch(ExceptionType1 e2)
{
//抛出异常ExceptionType1时的异常处理代码
}
catch(ExceptionType2 e2)
{
//抛出ExceptionType2时的异常代码
}
finally
{
//无论是否抛出异常,都会执行的代码
}
try语句块中是可能抛出的代码,如果该块内的代码没有出现异常,后面的各个catch块都不起任何作用。
但如果该块中的一条语句抛出了异常,则其后续语句不在执行,而是转到catch进行异常类型匹配
catch语句块负责捕获指定类型的异常并进行处理。一个try块可以对应多个catch块,用于对多个异常类进行捕获,
如果要捕获的各个异常类之间没有继承关系,各个catch块的顺序无关紧要,但如果它们之间有继承关系,
则应将子类的catch块放在父类的catch块之前。因此Exception这个异常类的根类一定要放在最后一个catch里面。
在catch块中可以用getMessage()方法返回一个对发生的异常进行描述的字符串,用printStackTrace()方法打印方法的调用序列。
catch语句捕捉的范围要由小到达.
finally语句块是可选的,无论是否发生异常,finally语句块总会执行,一般用于释放资源,关闭文件等。
2、throw 或throws抛出
异常一般情况下,异常是由系统自动捕获的,但如果程序员不想再当前方法内处理异常,可以用throw语句将异常抛出到调用方法中。
调用方法也可以将异常再抛给其他调用方法,如果所有的方法都选择了抛出此异常,最后JVM将捕获它,输出相关错误信息,
终止程序运行。格式: throw new ExceptonTye(异常信息)
如果一个方法没有捕获可能抛出的异常,调用该方法的其他方法应该捕获并处理异常。为了明确指出一个方法不捕获异常,
而让调用该方法的其他方法捕获该异常,可以在声明方法的时候,使用throws抛出该类异常,如果抛出的是多个不同异常,
中间用逗号隔开。格式:public static void main(String[] args)thows 异常类型名 { }
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |