JavaSE基础入门_013_异常

异常

异常的概念

  • 概念:程序在运行过程中出现的不正常现象。出现异常不处理将终止程序运行。

 

  • 异常处理的必要性:任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。

 

  • 异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力。

 

异常的分类

  • Throwable:可抛出的,一切错误或异常的父类,位于 java.lang 包中。

    • 错误【Error】: JVM、硬件、执行逻辑错误,不能手动处理。

    • 异常【Exception】:程序在运行和配置中产生的问题,可处理。程序员可干预。

      • RuntimeException:运行时异常,可处理,可不处理。

      • CheckedException:检查时异常,必须处理。

 

常见运行时异常

类型说明
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 数组越界异常
ClassCastException 类型转换异常
NumberFormatException 数字格式化异常
ArithmeticException 算术异常

 

异常的产生

  • 当程序在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出异常。

 

异常的传递

  • 异常的传递: 按照方法的调用链反向传递, 如始终没有处理异常, 最终会由 JVM 进行默认异常处理 ( 打印堆栈跟踪信息 ).

 

异常的处理

  • Java的异常处理是通过5个关键字来实现的:

 

  • — try:执行可能产生异常的代码。

  • —catch:捕获异常,并处理。

  • —finally:无论是否发生异常,代码总能执行。

  • —throw:手动抛出异常。

  • —throws:声明方法可能要抛出的各种异常。

 

异常处理 try ... catch

try {
//可能出现异常的代码
} catch (Exception e) {
// 异常处理的相关代码,如:getMessage()、printStackTrace()
}
  • 会有三种情况:

    1. 正常请求,无异常

    2. 出现异常并处理,发生异常并成功捕获

    3. 异常类型不匹配,发生异常不能捕获【catch 指定的异常类型不匹配】

异常处理 try ... catch ... finally

try {
//可能出现异常的代码
} catch (Exception e) {
// 异常处理的相关代码,如:getMessage()、printStackTrace()
} finally{
  // 是否发生异常都会执行,可以释放资源等...
}
  1. finally 块是否发生异常都执行,可以释放资源

  2. finally 块不执行的唯一情况,finally之前退出 java 虚拟机

 

异常处理 多重catch

try {
//可能出现异常的代码
} catch (异常类型1) {
//满足异常类型1执行的相关代码
} catch (异常类型2) {
//满足异常类型2执行的相关代码
} catch (异常类型3) {
//满足异常类型3执行的相关代码
}
  • 子类异常在前,父类异常在后。

  • 发生异常时按顺序逐个匹配。

  • 只执行第一个与异常类型匹配的catch语句。

  • finally根据需要可写或不写。

  • 遵循从子(小)到父(大)的顺序,父类异常在最后。

 

异常处理 try...finally

  • try...finally不能捕获异常,仅仅用来当发生异常时,用来释放资源。

  • 一般用在底层代码,只释放资源不做异常处理,把异常向上抛出。

  • try{
    //可能出现异常的代码
    }finally{
       //是否发生异常都会执行,可以释放资源等...
    }

 

声明异常

  • 如果在一个方法体中抛出了异常,如何通知调用者?

  • throws关键字:声明异常

  • 使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断。

 

抛出异常

  • 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常。

  • throw 关键字:抛出异常

  • 语法:

    • throw 异常对象;//已经存在的异常对象
      throw new RuntimeExecption( "异常信息" );

 

自定义异常

  • 需继承自 Exception 或 Exception 的子类,常用 RuntimeException 。

  • 必要提供的构造方法:

    • 无参构造方法

    • String message 参数的构造方法

 

方法覆盖(重写)

  • 带有异常声明的方法覆盖:

    • 方法名、参数列表、返回值类型必须和父类相同。

    • 子类的访问修饰符和父类一致或比父类更宽

    • 子类中的方法,不能抛出比父类更多、更宽的检查时异常。

 

总结

  • 异常的概念:

    • 程序在运行过程中出现的特殊情况。

  • 异常的分类:

    • RuntimeException:运行时异常,可处理,可不处理。

    • CheckedException:检查时异常,必须处理。

  • 异常的产生:

    • 程序遇到错误,或手动抛出异常

  • 异常的传递:

    • 按照方法的调用链反向传递,如始终没有处理异常,最终会由 JVM 进行默认异常处理(打印堆栈跟踪信息)。

  • 异常的处理:

    •     try {

      } catch (Exception e) {

      }finally {
        }
  • 带有异常声明的方法覆盖:

    • 子类中的方法,不能抛出比父类更多、更宽的异常。

原文地址:https://www.cnblogs.com/77-is-here/p/13045772.html