Java-异常处理

来源:互联网 发布:软件开发实施方案 编辑:程序博客网 时间:2024/05/20 11:25

问题引申:
try{}里面有一个return语句,那么finally{}块中的代码能否被执行?如果能够被执行,什么时候执行,return前还是return后?

在Java语言中,finally的作用是为了保证无论在什么情况下,finally块的代码一定会被执行,但是return语句代表着结束当前的函数,因此finally块中的代码一定会被执行,而且在return语句之前执行,如果finally中有return语句,那么finally中的return语句将覆盖try和catch中的return语句。

关于finally中return的深度剖析:
在一个方法内部定义的变量存储在栈中,当这个函数结束后,对应的栈就会被收回。因此return返回的不是变量,而是复制一份在返回。
因此复制后对变量的修改有可能有用,也有可能没用。当变量是基本数据类型时,没有用,因为修改的是先前的值,不是复制后的值,返回的是复制后的值;如果是引用变量,那么有用,因为复制前后变量指向的是同一个引用。


问题引申:
出现在finally块中的代码是不是一定会被执行?

不一定会被执行,以下两种情况就不会。
1.在进入到try块之前就出现异常,直接结束。
2.在try块中强制退出(exit)。


异常处理的原理:
异常是指程序在运行时所发生的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。这个异常可以在catch块中捕获,然后进行处理。
异常处理的目的:增加程序的安全性和鲁棒性(健壮性)。


违反语义规则的两种情况:
1.Java类库内置的语义检查,例如当数组下标越界时,会引发IndexOutOfBoundsException,当访问null对象时,会引发NullPointerException.
2.java允许开发人员扩展这种语义检查,开发人员可以创建自己的异常类(继承java.lang.Throwable),并自由选择何时用throw关键字抛出异常。


Java语言将异常当做对象来处理,并规定了一个基类java.lang.Throwable作为所有异常的父类。
在Java中,有许多异常类,大体分为Error(错误)和Exception(异常)两种。
Error:
error表示程序在运行期间出现了非常严重的错误,并且这个错误是不可恢复的,这种错误属于JVM层次的错误,因此可以导致程序终止运行。
这种错误属于逻辑错误,是应该被解决的,在程序中不应该出现。因此编译器不会检查error是否被处理,不推荐在程序中捕获error异常。
OutOfMemoryError、ThreadDeath都属于error错误,当他们出现时,JVM一般会选择终止程序。
Exception:
Exception表示可恢复的异常,编译器可以捕捉到。它包含两种,分别是检查异常(checked exception)和运行时异常(runtime exception)。

检查异常:
是在程序中经常碰到的异常。所有继承Exception且不是运行时异常都属于检查异常,比如常见的IO异常和SQL异常。这些异常出现在编译阶段,编译器会强行去捕获此类异常,一般讲可能出现异常的代码放到try catch块中。
检查异常在一下两种情况下使用:
1.异常的发生不会导致程序出错,进行处理后可以继续执行后续的操作,例如数据库连接失败,就可以重连数据库。
2.程序依赖不可靠的外部条件,例如系统IO。

运行时异常:
编译器不会强制去捕获此类异常。如果不对异常进行处理,就会由JVM处理,例如NullPointerException异常。
出现运行时异常时,会将异常一直往上抛出,知道遇到处理代码位置,若没有处理代码,则抛到最上层。多线程用Thread.run()方法抛出,单线程用main()方法抛出。


异常处理需要注意的问题:
1.先捕获子类,再捕获基类,不然捕获子类的代码永远不会被执行。
2.今早抛出异常。
3.根据实际的需求自定义异常。
4.异常能处理就处理,不能处理就抛出。

原创粉丝点击