关于try catch的总结

首先是最基本的一点 try  catch代码块是可嵌套的

try catch嵌套,内层不能捕获时,会考虑外层内否捕获,内层能捕获,则外层catch不执行。

那么多个catch怎么执行,看一个例子

 public class ExceptionTryCatchTest {  
    public void doSomething() throws IOException{  
        System.out.println("do somthing");  
    }  
    public static void main(String[] args){  
        ExceptionTryCatchTest etct = new ExceptionTryCatchTest();  
        try {  
            etct.doSomething();  
        } catch (Exception e) {  
              
        } catch (IOException e) {  
              
        }  
    }  
  
}  

上面的程序不能编译通过。

编译的时候会报错:已捕捉到异常 java.io.IOException。  catch(IOException e)这句有错误。

分析:对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。对我们这个方法来说,抛出的是IOException,当执行etct.doSomething();时,可能会抛出IOException,一但抛出IOException,它首先进入到catch (Exception e) {}里面,先和Exception匹配,由于IOException extends Exception,根据多态的原则,IOException是匹配Exception的,所以程序就会进入到catch (Exception e) {}里面,进入到第一个catch后,后面的catch都不会执行了,所以catch (IOException e) {}永远都执行不到,就给我们报出了前面的错误:已捕捉到异常 java.io.IOException。

在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要放在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到...异常的错误。



还有几个关于return的总结

1. 当catch中没有return返回语句是,try  catch  finally是按从上到下的顺序依次执行!

扫描二维码关注公众号,回复: 1870873 查看本文章

2. 当catch中有return语句时,执行结果是先执行catch中的内容,当执行到return的时候,先去执行finally中的内容,最后执行return语句。

3. 当catch和finally中都有return字句时,finally中的return字句会覆盖catch中的return返回值.

4. 当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为基本类型,string, Date类型时,在finally中修改返回值的值时,不影响catch中return的返回值结果)

 public static String test() {
	       String string="";
	        try {
	            System.out.println(2 / 0);
	        } catch (ArithmeticException ae) {

	        	string="shi";
	        	return string;
	        } finally {
	            System.out.println("catch成功!");
	            string="ss";
	           
	        }
	        return "";
	    }

上面代码最终返回的结果并不是“ss”,而是“shi”,对于返回基本的数据类型也是这样,finally中不会改变返回值。

当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为list,map,数组时,在finally中修改返回值的值时,会影响catch中return的返回值结果):

	 public static int[] test() {    
	       int[] a={1,2,3};
	        try {
	            System.out.println(2 / 0);
	        } catch (ArithmeticException ae) {
	        	return a;
	        } finally {
	            System.out.println("catch成功!");
	            a[0]=10;
	        }
	        return a;
	    }
这种返回引用类型,finally中的改变就是有效的,上面的代码中返回是数组中a[0]已经该变成10








猜你喜欢

转载自blog.csdn.net/u010365819/article/details/80815534
今日推荐