JAVA基础知识——异常

异常

什么是异常?

不正常就是异常

处理异常

​ 通过大量的if判断来确保程序没有异常,但是客户是万恶之源,时常会有程序员没有想到的输入。再切,编写的判定逻辑不可能江所有情况都囊括经期,jvm的处理方式就是 暂停程序>报错(异常内容 [什么异常 原因描述] 异常行数,所以不要让jvm去处理异常.

​ 通过if判定完成if判断完成一场校准是的代码臃肿,不利于阅读以及维护,而java中的提供了完整的异常处理方案,能够帮助我们在编写代码过程中,处理 程序中的异常信息。

try-catch

语法结构:

try{
    //有可能出现异常的代码块
}catch(声明异常){
    //异常解决办法
}

执行顺序:

  1. 执行try块中的内容

  2. 如果try块中的内容出现异常,执行catch块

  3. 匹配catch中的声明的异常信息,如果匹配上,则执行catch中的代码

  4. 继续执行后续代码

  5. 如果catch中异常信息未匹配到,那么此时交由jvm处理该异常

    catch中的类型一定要注意 能要能够扑捉到try块中实际出现的信息

    如果忘记具体异常信息可以使用Exception去捕获异常信息

try{
    System.out.println(1/0);// new ArithmeticExpection();出现异常
}catch(Exception e){
    //记录异常信息
    System.out.println("除数不能为0");//不要再catch块中做业务逻辑判断
}

try-多层catch

语法结构:

 try{
        //可能出现异常的代码段
    }catch(异常1){
        //异常 的解决办法
    }catch(异常2){
         //异常 的解决办法
    }.......{
   }

执行顺序:

  1. 执行try块中的内容

  2. 如果try块中的内容出现异常,逐一匹配catch中的内容

  3. 匹配catch中的声明的异常信息,如果匹配上,则try-catch执行结束

  4. 如果catch中异常信息未匹配到,那么此时交由jvm处理该异常

    注意事项:

    1. 在多重catch中一般情况下会在最后一个catch语句编写Exception,用来捕获可能为识别的异常信息
    2. 不要在第一个catch中编写父类异常(包括Exception),会使得其余的子类异常被屏蔽
try {
            int num1 = input.nextInt();//InputMismatch
            
            System.out.println("请输入第二个数》》》》》");
            int num2 = input.nextInt();
            int result = num1/num2;
             System.out.println(num1+"/"+num2+"="+result);
            
        }catch(ArithmeticException e) {
            System.out.println("除数不能为0");
            //System.out.println(e.toString());
            //e.printStackTrace();
            System.out.println(e.getMessage());
        }catch(InputMismatchException e) {
            System.out.println("用户输入有误");
        }catch(Exception e) {
            System.out.println("网络加载问题。。。。");
        }

异常对象的常用针对方法:

  1. toString: 当前异常类型以及原因描述

  2. printStackTrace: 打印堆栈信息 异常类型以及原因描述 异常位置

  3. getMessage:获取

    try-catch-finally

    语法结构:

try{
    //可能出现异常的代码
   }catch(异常1){
    //处理办法
    }.....{
   }finally{
    //代码块
    //关闭资源的代码  
                }    

执行顺序:

1:执行try块 如果出现异常 new出当前异常对象

2:逐一匹配catch中的异常内容

3:如果匹配上 执行对应的catch中的代码

4:如果未匹配上 jvm去解决当前异常信息

5:不论是否匹配成功 都会执行finally中内容

try {
            int num1 = input.nextInt();
            System.out.println("请输入第二个数》》》》》");
            int num2 = input.nextInt();////new IllegalStateException 
            int result = num1/num2;
            System.out.println(num1+"/"+num2+"="+result);
            System.exit(0);
            return 1;
        }catch(InputMismatchException e) {
            System.out.println("输入有误");
        }catch(ArithmeticException e) {
            System.out.println("除数不能为0");
        }catch(Exception e) {
            System.out.println("网络加载有误。。");
        }finally {
            System.out.println("我是finally");
            input.close();
        }

如何能使得finally不执行
编写System.exit() 关闭虚拟机

改变:在jdk1.7之后 对于try-catch-finally的改变

可以对于流、网络连接对象的创建声明在try的()中,后续无需通过使用finally显式的关闭资源

try (Scanner input = new Scanner(System.in);
                InputStream is = new FileInputStream(new File(""))){
            System.out.println("请输入第一个数》》》》》");
            int num1 = input.nextInt();
            System.out.println("请输入第二个数》》》》》");
            //input.close();
            int num2 = input.nextInt();////new IllegalStateException 
            
            
            
            int result = num1/num2;
            
            System.out.println(num1+"/"+num2+"="+result);
            input.close();
            
        }catch(InputMismatchException e) {
            System.out.println("输入有误");
        }catch(ArithmeticException e) {
            System.out.println("除数不能为0");
        }catch(Exception e) {//Exception e = new IllegalStateException 
            System.out.println("网络加载有误。。");
        }

throw和throws

  1. throw声明当前代码块中可能存在的异常信息 ,并且将当前异常信息抛出给调用者。而对于调用者而言,通过try-catch捕获异常,不管当前异常,交由jvm做

  2. throw会导致当前程序中断,后续代码不再执行。

    throws在方法外对外抛出异常,调用这解决当前异常。

    main方法中对外抛出的异常全部交由jvm做

    public static void main(String[] args) /* throws AgeException */{
         
         //通常情况 throws 和throw配套使用
         User u = new User();
         try {
             u.setAge(-1);
             
         }catch(AgeException e) {
             //System.out.println("年龄有误。。。");
             System.out.println(e.getMessage());
         }
         System.out.println(u);
         
     }
    

    自定义异常

    1.jdk中提供的异常信息不满足目前的使用

    2.自定义异常的方法

    先声明一个自定义异常类 在使得该类继承Expection

    最后编写一个空构造器 一个带参构造器

    public class AgeException extends Exception{
     
     
     public AgeException() {
     }
     
     // 当前异常的原因描述
     public AgeException(String msg) {
         super(msg);
     }
     
    }
    
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容