Java异常:异常处理


JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理:

  • 把异常的名称,异常原因及异常出现的位置等信息输出在控制台
  • 程序停止执行

自行处理方案

如果程序出现了问题,我们需要自己来处理,有三种方案:

  1. try……catch……
  2. throw
  3. throws

自行处理后,程序可继续执行。

try……catch……

  • 格式:

    在这里插入图片描述

  • 执行流程:

    1. 程序从try里面的代码开始执行
    2. 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统
    3. 当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
    4. 执行完毕后,程序还可以继续往下执行
  • 快捷键:Ctrl+Alt+T

  • 举例:

    捕获单个异常:

    package com.exception;
    
    public class Test {
        public static void main(String[] args) {
            int a=1;
            int b=0;
            try { //try监控区域
                System.out.println(a/b);
            }catch (ArithmeticException c){ //catch捕获异常
                System.out.println("程序出现异常,变量b不能为0");
            }finally { //处理善后工作,例如:scanner.close()
                System.out.println("finally");
            }
        }
    }
    

    在这里插入图片描述

    假设要捕获多个异常,catch内的异常变量应从小范围到大范围,否则会发生覆盖:

    package com.exception;
    
    public class Test {
        public static void main(String[] args) {
            int a=1;
            int b=0;
            try {
                System.out.println(a/b);
            } catch (Error e) {
                System.out.println("Error");
                e.printStackTrace();
            } catch (Exception e) {
                System.out.println("Exception");
                e.printStackTrace(); //打印栈信息(异常信息)
            } catch (Throwable e) {
                System.out.println("Throwable");
                e.printStackTrace();
            } finally {
                System.out.println("finally");
            }
        }
    }
    

    在这里插入图片描述

throw

  • 概述:

    throw:主动抛出异常,一般在方法中使用,在这里只是抛出异常,并不对异常做处理

  • 举例:

    package com.exception;
    
    public class Test {
        public static void main(String[] args) {
            new Test().test(1,0);
        }
        public void test(int a,int b){
            if (b==0){
                throw new ArithmeticException(); //主动抛出异常,一般在方法中使用
            }
        }
    }
    

    在这里插入图片描述

throws

  • 概述:

    throws用来声明一个方法可能产生的异常,不做任何处理,而是将异常往上传,谁调用就抛给谁

  • 举例:

    • 运行时异常:

      package com.exception;
      
      public class Test2 {
          public static void main(String[] args) {
              method();
          }
          //运行时异常
          public static void method() throws ArrayIndexOutOfBoundsException{
              int[] arr={1,2,3};
              System.out.println(arr[3]); //ArrayIndexOutOfBoundsException
          }
      }
      

      在这里插入图片描述

    • 编译时异常:

      package com.exception;
      
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      public class Test3 {
          public static void main(String[] args) {
              System.out.println("开始");
              try {
                  method();
              } catch (ParseException e) {
                  e.printStackTrace();
              }
              System.out.println("结束");
          }
          //编译时异常
          public static void method() throws ParseException {
                  String s="2048-08-09";
                  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
                  Date d = sdf.parse(s);
                  System.out.println(d);
          }
      }
      

      在这里插入图片描述

  • 注意:

    • 编译时异常必须要进行处理,两种处理方案:try……catch……或者throws,如果采用throws这种方案,将来谁调用谁处理
    • 运行时异常可以不处理,出现问题后,则需要我们回来修改代码

throw和throws的联系和区别

  • 联系:

    throw和throws都只是抛出一个异常,并未对异常做出处理,如果要做处理还需要用到try……catch……,这样程序才能不受异常的影响,继续执行下去。

  • 区别:

    throwsthrow
    用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁用来抛出一个具体的异常类型
    用在方法声明后面,跟的是异常类名用在方法体内,跟的是异常对象名
    可以跟多个异常类名,用逗号隔开只能抛出一个异常对象名
    表示抛出异常,由该方法的调用者来处理表示抛出异常,由方法体内的语句处理
    表示出现异常的一种可能性,并不一定会发生这些异常一定抛出了某种异常
    处理异常:调用者通过 try-catch捕获并处理此异常,或者调用者继续声明此异常。注意:到了main方法仍在继续声明异常的话,则此异常最后将交于JVM处理处理异常:在抛出异常处,通过 try-catch捕获并处理此异常,或者抛出一个异常(throws 异常)

重要声明:本篇文章整理自B站狂神说Java黑马程序员全套Java教程

参考文章:https://blog.csdn.net/weixin_38011265/article/details/79149313

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值