您的位置:首页 > 编程语言 > Java开发

Java学习笔记之异常的定义和处理

2013-04-21 22:27 387 查看
一、Java中,非正常情况分为两种:异常Exception和错误Error。

1.Error错误无法处理,Error错误一般是与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等。

2.Java将异常分为两种:Checked异常和Runtime异常

在Java中,Checked异常都是可以在编译阶段可以被处理的异常,因此Java强制程序处理所有的Checked异常,Runtime异常则无需程序编写人员处理。

3.对Checked异常处理的两种方式:①当前方法明确知道如何处理该异常,使用try...catch块来捕获异常,然后在对应的catch块中修复异常。

②当前方法不知道如何处理该异常,应该在定义该方法时声明抛出该异常。此时可以使用throws关键字声明抛出异常。

该异常将由上一级调用者处理,如果main方法也不知道如何处理异常,也可使用声明抛出异常,交给JVM处理。

JVM将跟踪栈信息打印处理啊,中止运行的程序(example:public void test() throws Exception1,Exception2 {} )。

使用throws抛出异常的一个限制:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,

子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。

4.Runtime异常无需显式声明抛出,如果需要捕获Runtime异常也可使用try...catch块。

二、Java异常处理机制的语法结构:

try {

//业务逻辑

} catch(Exception e) {//(Exception e)表示该catch块用于处理该异常类及其子类的异常实例

//进行异常处理

}

1.异常抛出:当try块中的业务逻辑代码执行过程中出现异常时,系统自动生成一个异常对象,

该异常对象被提交Java运行时环境,此为抛出异常。

2.当Java运行时环境接收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,

则将该异常对象交给该catch块处理,此为捕获异常,

如果找不到捕获异常的catch块,则运行时环境终止,程序退出。

3.注意:无论程序是否包含try、catch块,当程序执行过程中出现异常时,系统总会自动生成一个异常对象,

如果没有对异常对象进行处理,运行环境终止,程序退出。

三、多catch块的执行:try块后可以跟多个catch块,方便处理不同的异常类。

程序执行过程中不同的意外情况会产生不同的异常对象,

Java运行时环境接收到异常对象后会依次与catch块中的异常类进行比较,

以决定使用哪个catch块来处理该异常。 如果try块被执行一次,则try块后只有一个catch块会被执行。

在编写异常捕获时,应该把所有父类异常的catch块排在子类异常catch块的后面(先处理小异常,再处理大异常),否则将出现编译错误。

四、对异常信息的访问:异常对象中包含的用于访问异常信息的几个方法:

getMessage():返回该异常的详细描述字符串

printStackTrace():将该异常的跟踪栈信息输出到标准错误输出

printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流

getStackTrace():返回该异常的跟踪栈信息

五、使用finally回收资源:为了保证一定能回收try块中打开的资源,异常处理机制提供了finally块。

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

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

注意:应当尽量避免在finally块中使用return或throw等导致方法终止的语句。

完整的Java异常处理语法结构:

try {

} catch(SubException e) {

//处理异常

} catch(SubException e) {

//处理异常

} finally {

//进行资源回收(数据库连接、网络连接、磁盘文件等)

}

try块出现时,catch块和finally块至少出现其中之一,也可以同时出现,finally块必须位于所有catch块之后。异常处理支持嵌套。

六、使用throw抛出异常:使用throw语句可以完成程序自行抛出异常(throw ExceptionInstance),throw语句可以单独使用,它抛出一次抛出一个异常实例。

当程序执行到出现异常时,将会中止当前的执行流,调到异常对应的catch块,使用throw抛出的异常,亦是如此。

catch和throw同时使用,可以用于完成几个方法协作处理一个异常的工作,在一个方法中进行部分处理,然后再次抛出。

异常转译:程序先捕获异常,然后抛出一个新的业务逻辑,然后新的业务异常包含了对用户的提示信息。

七、Java7中异常处理机制的新特性:多异常捕获、自动关闭资源的try块、增强的throw语句

1.多异常捕获即使用一个catch块捕获多种类型的异常,多种异常类型之间用(|)隔开,异常变量有隐式的fanal修饰

2.自动关闭资源的try块:在try关键字后紧跟一对圆括号,圆括号中可以声明、初始化一个或多个资源,try语句在该语句结束时自动关闭这些资源(这些资源实现类必须实现了
AutoCloseable或Closeable接口)。此时,try语句块相当于包含了隐式的finally块,因此可以既没有catch块和finally块。

3.从Java7开始,Java编译器会检查throw语句抛出异常的实际类型。

例子:public static void main(String[] args) throws FileNotException {//throws Exception

try {

new FileOutputStream("a.txt");

} catch(Exception ex) {

ex.printStackTrace();

throw ex;//在JAVA7以前,编译器会认为可断代码可能抛出Exception异常

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: