java异常处理总结

1、try块后面可以有多个catch块,当包含catch子句时finally子句是可选的,包含finally子句时,catch子句是可选的。
2、在try块中当程序发生异常时后面的代码不会执行,进入catch代码块,catch代码对异常处理完毕后,程序作出向后执行,不会因为异常而终止。
3、无论try块中是否发生异常,finally块都会执行,除了try-catch代码块中执行System.exit(0),表示退出当前的java虚拟机。
4、
(1)在try或catch中有return语句,finally代码块中没有return语句,finally代码块中的语句仍旧会执行,程序执行到return语句时,会将变量保存,待执行完finally语句后,再返回,finally块中的语句不会影响最终的返回值,但finally块中的语句会改变变量的值。
(2)当try-catch代码块中都含有return语句时,具体可以分为两种情况:当try代码块中没有异常时,会执行try代码块中的return语句(return语句后面不能在有代码,因为程序执行到return时就停止了),但是程序时先将try代码块中return的返回值保存下来,跳过catch代码块(因为没有异常),执行finally代码块,finally代码块可能回改变catch代码块中return语句返回的变量的值,但是不会改变返回值(因为返回值已经保存了),若此时finally代码块中有return语句会执行return语句,并返回此时的返回值,(因此尽量不要在finally内写return),若finally代码块中没有return语句,程序会结束,并返回之前保存的返回值。
总结为:finally代码块一定会执行,若finally代码块中有return最终返回的是finally代码块中的返回值;若finally代码块没有return语句,try代码块中没有异常时,会执行try代码块中的return语句;若finally代码块没有return语句,try代码块中有异常时,会执行catch代码块中的return语句(finally代码块仍然执行,但不会改变返回值)。
1中的示例:

try代码块后可以添加多个catch代码块,finally代码块为可选的
try {
    	   程序代码1
       }catch(异常类型1 e1) {
    	   程序代码2
       }catch(异常类型2 e2) {
    	   程序代码3
       }catch(异常类型3 e3) {
    	   程序代码4
       }
try代码块后不加catch块,只有finally代码块       
        try {
    	   程序代码1
       }finally {
    	   程序代码5
       }
try代码块后添加多个catch代码块,和一个finally代码块     
try {
    	   程序代码1
       }catch(异常类型1 e1) {
    	   程序代码2
       }catch(异常类型2 e2) {
    	   程序代码3
       }catch(异常类型3 e3) {
    	   程序代码4
       }finally {
    	   程序代码5
       }
    

2对应的示例:

public class TestTryCatch {
	public static int div(int a, int b) {
		return a/b;
	}
	public static void main(String[] args) {
		System.out.println("异常捕获开始");
		try {
			int val = div(10, 0);// 此处出现异常,后面的代码不会执行
			System.out.println(val);
			
		}catch(ArithmeticException e) {
			System.out.println("捕获到了异常"+e);
			return;//catch块中有return语句,finally块仍然会执行
		}finally {
			System.out.println("开始执行finally代码块");
		}
	}

}

结果:

异常捕获开始
捕获到了异常java.lang.ArithmeticException: / by zero
开始执行finally代码块

3对应的示例:

package exception;

public class TestTryCatch {
	public static int div(int a, int b) {
		return a/b;
	}
	public static void main(String[] args) {
		System.out.println("异常捕获开始");
		try {

			int val = div(10, 0);// 此处出现异常,后面的代码不会执行
			System.out.println(val);
			
		}catch(ArithmeticException e) {
			System.out.println("捕获到了异常"+e);
			System.exit(0);
			System.out.println("能不能执行");
			return;//catch块中有return语句,finally块仍然会执行
		}finally {
			System.out.println("开始执行finally代码块");
		}
	}

}

结果:

异常捕获开始
捕获到了异常java.lang.ArithmeticException: / by zero

finally块没有执行。

4对应的示例:

package exception;

public class TestFinally01 {
	public static int get(){
        int x =1;
        try{
            ++x;
            return x;
        }finally {
            ++x;
            System.out.println("finally:"+x);
        }
    }
    public static void main(String[] args){
        System.out.println("最终返回值:"+get());
    }
}

结果:

finally:3
最终返回值:2

finally块改变了变量x的值,并没有改变返回值。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值