Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 391|回复: 0

java实训 :异常(try-catch执行顺序与自定义异常)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-2 11:03:43 | 显示全部楼层 |阅读模式
    关键字:
    try:执行可能产生异常的代码
    catch:捕获异常
    finally:无论是否发生异常代码总能执行
    throws:声明方法可能要抛出的各种异常
    throw:手动抛出自定义异常
    用 try-catch-finally 异常处理:
    情况一(正常运行,无异常):
    执行try,执行finally,执行finally块后的语句
    情况二(try中出现异常)
    执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句
    public class Test2 {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
             System.out.println("请输入被除数:");
            try { // 将开始可能异常的代码放入try
                int num1 = in.nextInt();
                System.out.println("接受除数");
                int num2 = in.nextInt();
                System.out.println(num1+"/"+num2+"="+num1/num2);
                //return;
                //异常块:catch和finally必须至少出现一个,try块必须有
            }catch (InputMismatchException e){//try中有匹配的异常,异常后的语句均不执行,直接调用catch,然后执行catch块之后的程序,若有异常但不匹配,不执行catch块,程序直接结束
                System.out.println("出现错误,被除数和除数必须为整数");
                //e.printStackTrace();//输出异常堆栈信息,打印错误序列,调用过程
                e.getMessage();
                //System.exit(1);
                return;
            }catch (ArithmeticException e){
                System.out.println("被除数不可为0");
                e.printStackTrace();
            }finally {//无论是否发生异常,异常是否匹配,都会执行finally,若catch调用System.exit(1);finally与finally之后语句均不执行
                System.out.println("感谢使用");
            }
            System.out.println("finally之后语句");
    特殊情况之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向上继续抛出这个异常(异常可以抛出多个,每个用逗号隔开),强制调用者处理这个异常,调用者可以用try-catch处理,也可以继续向上声明,若在main方法处继续向上声明,就会让jvm去处理这个异常。
    自定义异常:
    第一步:若需要自定义异常名字,需新建一个类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抛出异常,位于方法参数列表后,可以跟多个异常类
     
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-4 04:53 , Processed in 0.055305 second(s), 26 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表