是否需要看这篇文章?
下面的例子中,如果正常执行返回值多少? 如果出现了ArithmeticException返回值多少? 如果出现非ArithmeticException(如NullPointerException)返回值多少?
如果你了解这个例子说明的问题,并了解例子中三种情况下的执行细节,这篇文章你就不用浪费时间看了。
例子:
public int testException_finally(){
int x;
try {
x = 1;
//int y = 1/0; //放开此处,出现ArithmeticException。
/*//注释掉 int y = 1/0;处,放开此处,出现NullPointerException
String str = null;
str.substring(0);
*/
return x;
} catch (ArithmeticException e) {
x =2;
return x;
} finally{
x = 3;
}
}
答案:
如果正常执行,返回值为1;
如果抛出ArithmeticException,返回值为2;
如果抛出其他Exception,则抛出该Exception,无返回值。
一看就知晓的同学们,散了吧。这篇文章你们不需要看了。
不知所云的同学们,请继续往下看。下面要说的正适合你☺
1. Java异常的分类
Throwable类是Java语言中所有异常和错误的基类。Throwable有两个直接子类:Error和Exception。Error用来表示编译期或系统错误,一般不用我们程序员关心(现在还是程序猿,但有一颗想做架构师的心☺);Exception是可以被抛出的异常的基本类型,这个才是我们需要关心的基类。
Java异常在设计时的基本理念是用名称代表发生的问题,异常的名称应该可以望文知意。异常并非全是在java.lang包中定义,像IO异常就定义在java.io包中。在Exception中,有一种异常:RuntimeException(运行时异常)不需要我们在程序中专门捕获,Java会自动捕获此种异常,RuntimeException及其子类异常再加上Error异常,被统一叫做unchecked Exception(非检查异常);其他的Exception及其子类异常(不包括RuntimeException及其子类异常),被统一叫做checked Exception(检查型异常)。对于检查型异常,才是我们需要捕获并处理的异常。非检查型异常Java会自动捕获并抛出。当然,我们也可以主动捕获RuntimeException型异常。但是Error型异常一般不去捕获处理。
2. Java异常处理的基本规则
对于可能发生异常的Java代码块,我们可以将其放入try{}中,然后在try之后使用catch(***Exception e){}处理抛出的具体异常,如果没有匹配的catch处理抛出的异常,则会将该异常向上一层继续抛出,直到抛至Main()方法。
有一些代码,我们希望不管try中的代码是成功还是失败都需要执行,那么这些代码我们就可以放在finally{}中。
Java的异常处理采用的是终止模型,即如果try块中的某处出现了异常,则立刻停止当前程序的运行,在堆中创建对应的异常对象,异常的处理转入到异常处理代码处(即对应的catch块),执行完异常处理代码后,try块中出现异常处之后的程序将不会被执行,程序会跳出try块,执行try块之外的程序。
例子:覆盖知识点:①执行对应的catch;②一定执行finally中代码;③try出异常之后的代码不再执行;
public String testException_one(){
String str =