Java中的异常及常见的处理方式

异常

      • 基本概念
      • 异常的分类
        • Throwable
        • Error
        • Exception
          • RuntimeException
          • CheckedException
      • 异常产生的原因
        • 自动产生异常
        • 手动产生异常
      • 异常的传递
      • 异常的处理
          • 消极处理异常(声明异常)
          • 积极处理异常
            • finally
            • 常见的结构小结
      • 自定义异常

基本概念

  1. 什么是异常
    程序运行过程中出现的非正常的情况
  2. 异常如何处理
    当异常出现时,执行预先准备好的程序
  3. 异常处理必要性
    减少用户的损失、同时也减少给用户带来的不必要的麻烦;也可以利用异常处理给与用户一些提示

异常的分类

Throwable

Throwable是Java语言中的异常或错误的父类,位于 java.lang 包中

  • Throwable的构造方法
    • Throwable() :无参数的构造方法
    • Throwable(String message):带有异常信息的构造方法
  • 成员方法:
    • String getMessage():获取字符串类型异常信息
    • void printStackTrace():打印输出方法调用过程中产生的 栈详细异常信息
Error

Error是Throwable的子类,代表错误

Error通常是仅靠程序本身无法恢复的严重错误,例如:JVM内存不足或是方法调用过程中栈溢出 (java.lang.StackOverflowError栈溢出)、 (OutOfMemoryError堆溢出)

Exception

Exception是Throwable的子类,代表异常,Exception可非为运行时异常(RuntimeException)和非运行时异常(CheckedException)

RuntimeException

运行时异常、未检查异常,和RuntimeException有直接或间接继承关系的异常类称为运行时异常

  • 特点
    编译器不检测此类异常,编译通过,但是运行报错
  • 处理
    运行时异常可处理也可以不处理,此类通过严谨代码 可以避免
  • 常见的运行时异常
    • ArrayIndexOutOfBoundsException( 数组下标越界)
    • StringIndexOutOfBoundsException( 字符串下标越界)
    • IndexOutOfBoundsException( 集合中下标越界)
    • java.lang.NullPointerException(空指针异常)
    • java.lang.ClassCastException(类型转换异常)
    • java.lang.NumberFormatException(数字格式转换异常)
CheckedException

非运行时异常、已检查异常,和 RuntimeException没有任何继承关系的异常类称为非运行时异常

  • 特点
    编译器检测此类异常,编译报错
  • 处理
    非运行时异常一旦出现,必须处理
  • 举例
    Class.forName(“Student”);// 区分于语法错误

异常产生的原因

自动产生异常
  • 产生原因
    程序运行过程中,遇到错误的代码,自动产生异常
  • 结果
    程序中一旦出现异常,程序不能继续执行之后的代码,则程序被终止掉
手动产生异常
  • 关键字
    throw
  • 语法
    throw new 异常类名(“异常信息”);
  • 位置
    定义在方法内部
  • 结果
    作用效果类似于 return语句,终止当前方法、函数;程序运行时因异常而被终止掉

异常的传递

Java中的异常沿着方法的调用链进行反方向进行传递,最终传递给JVM

异常的处理

消极处理异常(声明异常)
  • 关键字
    throws
  • 位置
    在方法声明处
  • 语法
修饰符 返回值类型 方法名(形参列表)throws 异常 的类名1,异常类名2{
// 方法的实现部分
}
  • 消极处理异常时,可以利用其父类型的异常进行处理
  • 结果
    消极处理异常只是推卸责任,最终将责任推卸给JVM,程序最终还是因异常而被终止
  • 作用
    消极处理异常可以让非运行时异常在编译时通过
积极处理异常
  • 语法
try{
   // 可能出现异常的语句
}catch(异常类名 e){
   // 异常出现执行的语句
}
  • try…catch常用语法
    • try…catch结构,一旦异常出现try…catch 才起作用
    • try后面可以跟多个 catch结构,一旦try中出现异常,则从 上往下依次进行匹配catch,直到匹配成功
    • catch中可以利用父类型捕获:本类+所有的子类型的异 常,体现多态
    • 子类型 的 catch 需要定义在 父类型的 catch前面
    • catch中 只能定义 try中可能出现的非运行时异常; catch中 可以定义任意的 运行时异常,即使try中不可能出现 此类运行时异常
finally

finally表示必须执行的语句

  • 语法
try{
   // 可能出现异常的语句
}catch(异常类名 e){
   // 异常出现时,执行的语句
}finally{
   // 不管有没有异常,必须执行的语句     }

开发时,通常不要将return定义在finally中,finally通常用于关闭资源,例如IO流等

常见的结构小结
  • try{}catch(){}
  • try{}catch(){}catch(){}
  • try{}catch(){}finally{}
  • try{}catch(){}catch(){}finally{}

以下结构遇到认识:

  • try{}finally{} 这种做法目的是保证某些代码放在finally中必须执行

  • try{ try{}catch(){} }catch(){}

  • try{}catch(){ try{}catch(){} }

  • try{}catch(){}finally{ try{}catch(){} }

    finally要么和try一起,要么try…catch一起,但是不 能单独使用

  • final、finalize、finally的区别

    • final:修饰符,可以用于修饰变量、方法、类
      final修饰的变量作用范围内的常量,允许一次赋值,不允许修改
      final修饰方法允许子类继承使用,但是不允许子类覆盖final修饰的类;不允许子类继承,即没有子类
    • finalize:方法名,此方法是Object类中的,在垃圾回收器回 收垃圾对
      象,jvm自动调用的方法
    • finally:积极处理异常时结构内容,必须执行的语句定义finally中
  • 常用的结构

    • try{}catch(){}finally{}
    • try{}finally{}

自定义异常

  • 一个类继承Exception或是其子类,如果定义的类继承了RuntimeException或是RuntimeException的子类,则此异常为运行时异常;如果此类和RuntimeException 没有任何继承关系,则异常类为非运行时异常
  • 提供两个构造方法
    a. 无参数的构造方法
    b. 有参数的构造方法,参数类型为String ,接收异常信息利用super(message); 设置异常信息

整理不易,喜欢请点个赞!
编者微信:1014961803,添加时请备注"CSDN"

你可能感兴趣的:(Java学习,java,javaee,javase)