异常(try-catch执行顺序)

关键字:

try:执行可能产生异常的代码
catch:捕获异常
finally:无论是否发生异常代码总能执行
throws:声明方法可能要抛出的各种异常
throw:手动抛出自定义异常

异常处理:try-catch-finally&&throw、throws

try-catch-finally

情况一(正常运行,无异常):
执行try,执行finally,执行finally块后的语句
情况二(try中出现异常)
执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句

package stringdem;

import java.util.Scanner;

public class Exceptiondemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sum = 0;
        double avg = 0;
            System.out.println(" 要计算几个整数的平均值呢:");
            int num = sc.nextInt();
            int a[] = new int[num];
            for (int i = 0; i < a.length; i++) {
                try {
                    System.out.println("请输入第" + (i + 1) + "个数");
                    a[i] = sc.nextInt();
                    if (a[i] < 0) {
                        throw new Exception();
                    }
                    sum = sum + a[i];
                } catch (Exception e) {
                    System.out.println(" N必须是正数或者0");
                    i = i - 1;
                }
            }
            System.out.println("平均数="+sum/num+"总数=" + sum);
    }
}





代码块中有return:

try中含有return:
a.无异常(执行顺序):

1.return之前的代码 2.finally 3.return语句 4.执行完成(不会执行return之后语句,也不会执行finally块之后的语句)

b.有异常(执行顺序):

1.异常之前与异常代码 2.catch语句 3.finally块 4.finally块之后语句 5.执行完毕(因为异常直接跳到catch块,所以try中return不会执行)

catch中含有return
a.无异常(执行顺序):

1.执行try代码块 2.执行finally块 3.执行finally之后的语句 4.退出(无异常,所以不执行catch,直接执行finally)

b.有异常(执行顺序):

这里有两种情况

情况一(异常匹配到的代码块中有return):

1.执行try块(异常语句后的try语句均不执行)2.执行catch块return之前的语句 3.执行finally块 4.执行catch中的return语句 5.退出

情况二(异常匹配到的代码块无有return,catch在其他chtch块中)

执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句

catch块的执行原理:

对于异常的捕获,可以有多个catch,对于try发生的异常,他会根据发生的异常和catch里面的异常类型进行匹配(按照catch块从上往下匹配,但并不会执行不匹配的catch块语句),当他匹配到某个catch块时,他就直接进入这个catch块内,忽略这个catch块后面的所有catch块,所以,一般将catch(Exception e)放在最后,catch块承先子类后父类排列。

注意:无论是否发生异常,异常是否匹配,均会执行finally块,阻止finally执行的唯一方法是在catch块中调用 System.exit(1) 语句(System.exit(1)表示非正常退出程序)。

throw和throws

自定义异常:

第一步:若需要自定义异常名字,需新建一个类MyException,并让它继承Exception;重写构造方法,

若不需要自定义异常名字,则可以略过第一步,在第二步直接书写 throw new Exception(“”);

public class MyEcxeption extends Exception {
    public MyEcxeption(String message) {
        super(message);
    }
}

第二步:在你需要的类中引用他(需要用关键字throw),注意,在引用类必须抛出这个异常

public void setSex(String sex) throws MyException{
    if (sex.equals("男") || sex.equals("女") ){
        this.sex = sex;
    }else {
        throw new MyException("性别必须为男或女");
    }

}

throw与throws的区别:

throw自行定义并抛出异常,位于方法体内部,只可以跟一个异常对象

throws抛出异常,位于方法参数列表后,可以跟多个异常类

`

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值