异常,finally&&return

异常

Throwable下有两种,一种是Error错误类,另一种是Exception异常类。

异常exception又分为运行时异常和非运行时异常

常见的4中运行时异常

  1. ClassCastException(类转换异常)

  2. IndexOutOfBoundsException(数组越界)

  3. NullPointerException(空指针)

  4. ArithmeticExceptio(除数为0)

运行时异常是在运行中出现的,在编译时是不会报错的,当你throw一个运行时异常时,不在方法外添加throws编译器也不会发生报错。

Throw:手动抛出异常

Throws:用在方法后面声明可能会抛出的异常

异常处理机制-try-catch-finally

如果异常出现,程序没有将其处理,那么程序就会中断,于是用异常处理机制-try-catch-finally。

try{

​ //可能发生异常的代码

}catch(){

​ //处理异常的代码

}finally{

​ //无论是否发生异常都会执行的代码,常用于程序资源的回收处理

}

-try-catch-finally中可以有多个catch也可以没有catch,但try必须和catch或者finally搭配使用。

dasda

  • 不要把所有的代码都写到try里面,try里面的代码执行时,系统维护堆栈跟踪信息,执行效率低

  • catch是捕捉异常的,顺序执行,所有不要把父类异常放在子类异常的上面,否则报错。如果catch里没有捕捉到当前的异常,那么程序还是会中断

  • finally里的代码,不管异常是否捕捉都一定会执行。例io流中的close()方法一般都放到finally里进行,finally于return也是个坑点。

finally&&return

直接上代码,下列输出结果是多少?
static int i=0;
public static int test(){
try {
System.out.println("try  "+i);
return i;
}finally{
++i;
System.out.println("finally  "+i);
}
}
public static void main(String[] args) {
System.out.println(test());
System.out.println(i);
System.out.println("-----------------");
}
结果:
try  0
finally  1
0
1
-----------------
程序运行到try中时,此时的i=0,有个return,应该结束方法,但是finally中的代码一定会执行,所以 i 在return的缓冲区中,继续执行finally中的代码,使得i=1,整个方法结束后返回的还是try中return的 i 的值:0 , i 的值自增为1。


在finally中也加了一个return呢
static int i=0;
public static int test(){
try {
System.out.println("try  "+i);
return i;
}finally{
++i;
System.out.println("finally  "+i);
return i;
}
}
public static void main(String[] args) {
System.out.println(test());
System.out.println(i);
System.out.println("-----------------");
}
结果:
try  0
finally  1
1
1
-----------------

finally的return最后执行,会覆盖掉try里面的return,所以这里方法的返回值为1。


接着看如下代码
public static int test02() {
int c = 0;
try {
c = 5 / 0;
System.out.println(5 / 0);
return 0;
} catch (NullPointerException e) {
System.out.println("空指针异常");
} finally {
System.out.println("finally");
}
return c;
}
public static void main(String[] args) {
System.out.println(test02());
System.out.println("test02 over");
}
结果:
finally
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.z.exception.Return1.test02(Return1.java:19)
at com.z.exception.Return1.main(Return1.java:35)
程序最后的"test02 over"没有输出,出错,因为catch中没有捕捉到异常,程序中断。


那么下面呢?
public static int test01() {
try {
System.out.println(5 / 0);
return 0;
} catch (NullPointerException e) {


} finally {
System.out.println("finally");
return 0;
}
}
public static void main(String[] args) {
System.out.println(test01());
System.out.println("test01 over");
System.out.println("---------------------");
}
结果:
finally
0
test01 over
---------------------

try中是有异常的:除数为0,而且catch中捕捉的是空指针异常,所以异常未被捕捉,程序应当中断,但为什么方法test01后面的“-------------”能输出呢? 原因是在finally中有return,使得方法无论是否有异常,异常是否被捕捉都有一个返回值,因此JVM并不会把它当做会产生异常发生中断来运行,方法都会正常运行并且返回finally的返回值,不影响后面程序的运行。

要注意的是,当finally有return时:

  • 它会覆盖try,catch中的return,方法返回的都将是finally中的

  • finally有return时,无论是否有异常,异常是否被捕捉,方法都将正常运行,后面的程序也正常运行





发布了42 篇原创文章 · 获赞 2 · 访问量 7955
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章