Java异常

异常

  • 概述
    程序出现了不正常的情况

    Error:严重问题,不需要处理
    Exception:异常类,程序本身可以处理的问题。

    • RuntimeException:运行时异常(编译可以通过:可不处理,出现问题,修改代码)
    • 非RuntimeExxception:编译时异常(编译不能通过:必须处理)
  • JVM默认异常处理

    public class Demo {
        public static void main(String[] args) {
            System.out.println("开始");
            Demo.method();
            System.out.println("结束");
        }
        //method()方法
        public static void method(){
            int[] i = {1,2,3};
            System.out.println(i[3]);
        }
    }
    ---*---
    输出结果:
    开始
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    	at com.testDemo14.Demo.method(Demo.java:12)
    	at com.testDemo14.Demo.main(Demo.java:5)
    

    如果程序出现了问题,但是没有做任何处理,JVM将会进行默认处理。

    1. 把异常的名称,异常原因及位置信息输出到控制台
    2. 终止程序
  • 手动异常处理

    • try catch [finally] 语句:

      try {
            可能出现异常的代码;
      } catch (异常类名 变量名) {
             异常的处理代码;
      } finally {
             清理代码;
      }

      public class Demo {
          public static void main(String[] args) {
              System.out.println("开始");
              Demo.method();
              System.out.println("结束");
          }
      
          //method()方法
          public static void method(){
              try {
                  int[] i = {1,2,3};
                  System.out.println(i[3]);
              } catch (ArrayIndexOutOfBoundsException e) {
                  e.printStackTrace();
                  System.out.println("数组索引越界");
              }finally {
                  System.out.println("这里一定会被执行");
              }
          }
      }
      ---*---
      输出结果:
      开始
      数组索引越界
      这里一定会被执行
      结束
      java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
      	at com.testDemo14.Demo.method(Demo.java:13)
      	at com.testDemo14.Demo.main(Demo.java:5)
      

      执行流程:执行 try 中代码,如果出现异常,生成一个异常类对象抛给Java运行时系统,当Java运行时系统接收到异常对象时,会到 catch 中找寻匹配的异常类,匹配到后赋值给 catch 中的异常变量然后进入 catch 块中对异常处理。异常处理完后程序可以继续执行。

    • throws 方法抛出异常
      throws 用在方法括号后,用于声明该方法可能抛出的异常,方法的调用者来处理异常。仅仅只是抛出异常

      public class Demo {
          public static void main(String[] args)  {
              System.out.println("开始");
              try {
                  Demo.method2();//此方法抛出的解析异常需要在这里处理
              } catch (ParseException e) {
                  e.printStackTrace();
              }
              System.out.println("结束");
      
          }
          //method2()方法 --- 解析异常
          public static void method2() throws ParseException{ 
              String s = "2021-5-5*";
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
              Date d = sdf.parse(s);//抛出异常
              System.out.println(d);
          }
      }
      ---*---
      输出结果:
      Wed May 05 00:00:00 CST 2021
      

      上面代码中 sdf.parse(s); 会抛出一个解析异常(ParseException),该异常是编译时异常,需要处理否则编译不能通过。或者也可以在方法上声明此方法会抛出一个解析异常,让方法调用者去处理。

    • 自定义异常类

      public class 自定义异常类名 extends Exception {
          无参构造
          带参构造

      }

      public class Demo2 {
          public static void main(String[] args) {
              System.out.println("开始");
              
              Scanner sc = new Scanner(System.in);
              System.out.println("请输入分数:");
              int a = sc.nextInt();
              try {
                  Tether.scor(a);
              } catch (MyException e) {
                  e.printStackTrace();
              }
      
              System.out.println("结束");
          }
      }
      //分数判断类
      class Teather {
          public static void scor (int i) throws MyException{
              //分数不合法会抛出异常
              if (i<0 || i>100){
                  throw new MyException("异常原因:分数只能在0 ~ 100之间");
              }else {
                  System.out.println("分数合法");
              }
          }
      }
      //自定义异常类
      class MyException extends Exception{
          public MyException(){}
          public MyException(String message){
              super(message);
          }
      }
      ---*---
      输出结果:
      开始
      请输入分数:
      105
      com.testDemo14.MyException: 异常原因:分数只能在0 ~ 100之间
      	at com.testDemo14.Teather.scor(Demo2.java:27)
      	at com.testDemo14.Demo2.main(Demo2.java:14)
      结束
      

      在使用自定义异常类的时候,出现我们认为不合法的地方,需要用 throw关键字 手动将异常抛出。下面说一下 throw 和 throws 的区别

    throwsthrow
    用在方法声明后,throws Exception(跟类名)用在方法体内,throw new MyException(跟对象)
    仅抛出,谁用谁处理产生异常,方法内处理
    有可能出现异常一定出现了异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值