首页 > 代码库 > 2.Java异常学习

2.Java异常学习

1.Java异常的概念

  • 异常的例子
  • 1.除法就是一个需要捕获异常的例子,除数又可能是0
  • 异常处理的基本流程如下
  • 一旦发生异常,就使得程序不按照原来的流程继续的运行下去
  • a.程序抛出异常
      • try{
      •     throw new Exception();
      • }
  • b.捕获异常
      • catch(Exception e){
        • //异常处理程序  
      • }
  • c.finally代码块
  • 必须注意的是:在finally块中不能抛出异常。
      • finally{
        • //一定会被执行
        • //除非catch中有System.exit(0);会推出Java虚拟机      
      • }
  • 总结:
  • 1.当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,则执行finally块代码。
  • 2.线程的run函数是不能抛出异常的(可以在函数内部捕获并处理,但是不能向上提交),run函数的异常被提交给uncaughtExceptionHandler处理,后变会详细介绍
  • 3.出了run函数其他的函数都可以把函数中抛出的异常向上级提交。

 

  • 异常的结构
  • 技术分享
  •                                 图1.异常结构(来自参考文献一)

 

  • 异常分类
  • 1.UnckeckedException--Error(不准确,但是Error确实是在运行时检查并抛出的)和RunTimeException-------程序中不需要进行补货
  • 2.checkedException-----IOException、ClassNotFoundException、CloneNotSupportedException
  • 这里的检查不检查针对的是编译器
  • 常见的RunTimeException-NullPointerException、数组越界、字符串越界、算数错误(a/b)、参数类型错误(Integer.parseInt(“abc"))

 

  • 在声明方法时候抛出异常

  • public void openFile() throws IOException{//code}
  • 一般函数申明的时候抛出的异常是chenckedException
  • 覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。

 

  • Cathch异常
  • 注意:一个try块可以处理多种类型的异常(最多只有一个catch模块会被执行,与switch不相同)
  • 逻辑上一个try后处理多个异常会报错—下面的代码会报错[先catch子类异常,之后再catch父类异常]
  • 因为后一个catch不可能被执行到
      • try{
      •      //code
      • }catch(Exception e){
      • }catch(RuntimeException e){//报错一定不会被执行到    
      • }

 

  • 自定义异常---就是继承自已有的异常
  • 最重要的其实是异常的名字
  • class MyException extends Exception{}
  • 默认的构造函数
  • 1.super() 调用基类的构造函数进行初始化
  • 2.super(message)

 参考文献:http://www.codeceo.com/article/java-exception-learn.html#0-tsina-1-56987-397232819ff9a47a7b7e80a40613cfe1

2.Java异常学习