异常

异常


1、异常概述

  • 1.什么是异常?Java提供异常机制有什么用?

    • 程序执行过程发生了不正常的情况,而这种不正常的情况叫做:异常。
    • java语言是很完善的语言,提供了异常的处理方式,以下程序出现了不正常情况,java把该信息打印输出控制台,供程序员参考。程序员看到异常信息后,可对程序进行修改,让程序更加健壮。
  • 2.异常信息是由jvm打印的。

2、java语言中异常存在形式

  • 1.java语言中异常以什么形式存在呢?

    • 异常在java中以类的形式存在。每一个异常类可以创建异常对象。
    • 并且jvm将new的异常对象抛出,打印输出在控制台。
    • 以类和对象的形式存在。
  • 2.异常对应对应现实生活是怎样的?

    • 如:丢鸡(异常类):

      • 张三家鸡被偷了
      • 李四家鸡被偷了
    • 类:模板 对象:实际存在的个体。

3、异常的继承结构

  • 1.使用UML图描述继承结构。什么是UML?有什么用?

    • UML是一种统一建模语言。只要是***面向对象***的编程语言,都有UML。

    • UML可以描述类与类之间的关系,程序的执行流程,对象的状态等。

    • 相当于设计图,在java软件开发中,设计师负责设计类,软件开发人员必须要看懂。

    • UML有很多绘图工具:

      • Rational Rose starUML等

      • Obeject下有 Throwable (可抛出的)

      • Throwable下有两个分支:Error和Exception

      • Exception有两个分支:

        • Exception的直接子类:编译时异常(又被叫做受检异常、受控异常)

          CheckedException

        • RuntimeException:运行时异常(未受检异常、非受控异常)

          UnCheckedException

        • 注意:所有异常都在运行阶段。

  • 2.编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。

    • 编译时异常因什么而得名?

    • 因为编译时异常必须发生在编译(编写)阶段预处理,如果不处理编译器会报错。因此得名,所有异常都是发生在运行阶段的。因为只有程序运行阶段才可以new对象。因为异常的发生就是new异常对象。

  • 3.编译时异常和运行时异常的区别?

    • 编译时异常一般发生概率高
    • 运行时异常一般发生概率低
    • 假设没有对异常进行划分,没有分为:编译时异常和运行时异常。所有的异常都必须在编写阶段进行预处理,那么效果如何?
      • 程序绝对安全,但很麻烦。

4、java语言中异常处理两种方式

  • 1.方法声明的位置上,使用throws关键字,抛给上一级。

    • 谁调用就抛给谁,抛给上一级。
  • 2.使用try…catch语句进行异常的捕捉。

    • 捉住了。
  • 注意:异常发生后,如果选择上抛,抛给调用者,调用者需要对这个异常继续进行处理,那么调用者处理这个异常同样有两种方式。

  • 注意:异常发生后,如果一直向上抛,最终抛给了main方法,main方法继续上抛,抛给了jvm,程序终止。所以一般抛给了main建议使用try…catch捕捉。

    • public class Test{
          public static void mian(String[] args){
              
              //程序执行到此处,发生了ArithmeticException异常,底层
              new了一个ArithmeticException异常对象,然后抛出了,由于main
              方法调用,所以抛给了main方法,main方法没有处理,所以抛给jvm, 		 程序终止运行
              System.out.println(100/0);
              System.out.println("hello world");
          }
      }
      
    • ArithmeticException继承RuntimeException,属于运行时异常。编写程序阶段,无需处理。

    • public class Test{
          public static void main(String[] args){
          
          	/*第一种:方法声明继续上抛,继续使用:throws,完成异常的继续上			抛.
          	 public static void main(String[] args) throws 				 ClassNotFoundException {
          	 	doSome()
          	 }	
               上抛类似推卸责任,继续把异常抛给调用者。
          	*/
          	
          	//第2中:try...catch进行捕捉
          	//异常真正解决了
              doSome();
          }
          
        public static void doSome() throws ClassNotFoundException{
              System.out.println("doooo");
          }
      }
      
    • 由于doSome()方法声明位置使用了throws ClassNotFoundException,表示方法执行阶段可能会出现throws ClassNotFoundException异常,叫做类没有找到异常,这个异常类直接父类:Exception,所以ClassNotFoundException属于编译时异常,所以调用doSome()方法必须进行预先的处理,否则编译器会报错。

    • 只要异常没有捕捉,采用上报的方式,后续代码不会执行。

    • 一个方法体中的代码出现异常后,如果上报的话,此方法结束。

5、try…catch

  • 1.catch后面的小括号可以是具体的类型,也可以是父类型(多态)。

  • 2.catch可以写多个。建议写catch的时候,一个一个处理。

  • 3.catch写多个时候,从上到下,必须遵守从小到大的原则。

    • jdk8:新特性 可以使用 | 。

    • 如果希望调用者处理,采用上报。不希望上报,使用try…catch。

6、异常对象的常用方法

  • 1.获取异常简单的描述信息:

    • String msg = exception.getMessage();
  • 2.打印异常追踪的堆栈信息:

    • exception.printStackTarce();
  • 3.实际开发中建议使用exception.printStackTarce();

    • 异常追踪信息:从上往下一行一行看。
    • 注意:sun写的代码就不用看了。看自己的代码。
  • 4.关于try…catch中的finally子句。

    • 1.在finally子句的代码是最后执行的,并且是一定执行的,即使try语句中的代码块出现了异常。finally子句必须和try一起出现,不能单独执行。
    • 2.finally语句通常是用在哪些情况呢?
      • 通常在finally语句块完成资源的释放/关闭。
      • 因为fianlly中的代码块比较有保障。
      • 即使try语句块中的代码出现异常,finally中代码块也会正常执行。
    • 注意: 这样 就废了,直接退出了 jvm。退出jvm之后,finally语句代码就不执行了。
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DnL4kbGG-1611319381905)(C:\Users\15124\AppData\Roaming\Typora\typora-user-images\1606742091575.png)]
    • //反编译之后效果
      public satic int (){
          int i = 100;
          int j = i;
          i++;
          return j;
      }
      
    • java语言规则:方法体中代码必须遵循自上而下的规则。

      • rerurn 一旦执行,整个方法必须结束。
    • fianize方法:调用gc处理器,回收对象。

7、自定义异常

  • 1.sun公司提供的jdk内置的异常是不够的。在实际开发中,有很多业务出现异常后,jdk倒是没有的。和业务挂钩,那么异常类我们可以自己定义。

  • 2.java中怎么自定义异常?

    • 编写一个类继承Exception或者RuntimeException。

    • 提供两个构造方法,一个无参,一个带有String参数的。

    • public class MyException extends Exception{
          public MyException(){
              
          }
          ppublic MyException(String s){
              super(s);
          }
      }
      
      public class Test{
          public static void main(String[] args){
              
              MyException e = new MyException("用户名不可为空");
              //打印异常堆栈信息
              e.printStackTrace();
              
              //获取异常简单信息
              String msg = e.getMessage();
              System.out.println(msg);
              
          }
      }
      
    • 记住:重写方法时,子类只能比父类抛出更少的异常。

    • 总结异常关键字

      • try catch finally
      • throws 方法声明位置使用,上报异常信息给调用者
      • throw 手动抛出异常

简单信息
String msg = e.getMessage();
System.out.println(msg);

    }
}
```
  • 记住:重写方法时,子类只能比父类抛出更少的异常。

  • 总结异常关键字

    • try catch finally
    • throws 方法声明位置使用,上报异常信息给调用者
    • throw 手动抛出异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值