异常

异常:

Throwable 类是 Java 语言中所有错误或异常的超类。

是什么?

程序在运行出现的问题,

异常的分类:

  • Throwable: 它是所有错误与异常的超类(祖宗类):

    • Error错误:必须修改代码,系统性问题

    • Exception:

      ​ RuntimeException:运行时异常

      ​ 非RuntimeException:编译时异常

如果不显式处理异常,最终会抛给jvm

成员方法

toString()
获取异常类名和异常信息,返回字符串。

printStackTrace()(常用)
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

有哪些捕获方式?异常怎么捕获?

标准格式:

try {
可能发生错误的代码
} catch (异常类名 异常对象名) {
对异常处理
} finally {
释放资源
}

finally 一定会执行,在异常发生之前执行。return也挡不住,System.exit(0)结束jvm

多个异常怎么捕获

try{}

catch(){}

catch(){}

catch(){}

一旦try catch有一个分支匹配成功,结束try catch

注意:

  • catch捕获的异常类名 不要写太宽泛的Exception。写具体的。
  • try代码块中某个位置产生了异常,那么try中的代码就不继续执行了
    • 也就是说try当中要么不产生异常,要么只会产生一个异常
  • catch中可以填入多个异常对象匹配,用符号 |,类型可写多个,引用只要一个。一般叫e。
  • try catch尽量简洁高效。
  • 异常类最常用的方法,e.printStackTrace() 打印和jvm报错一样的信息。包含异常的全限定类名,出错原因,出错行数
  • finally怎么都会执行。
  • 运行时异常,什么都不写自动抛出

捕获异常干什么

实际开发中,出现问题时经常的,但不是所有的问题都要让整个程序立即结束运行,这样会使用户的体验不好。通过异常捕获处理,让不影响全局的小错误,即使解决,或者暂时搁置,或者回馈给用户友好的信息。让整个程序继续运行。

抛出异常

throws

  • main方法抛出异常时不合理的。

  • throws(可能抛出) :在不需要处理的方法跑出去,在需要处理的地方让调用者处理。

  • 抛出编译时异常,会要求显式处理

  • 抛出运行时异常,不会要求显式处理

  • 当直接抛出Exception的时候,编译器会把它当作编译时异常处理,要求必须显式处理

  • 当同时抛出两个都是编译时异常且还有父子关系的时候,会强制要求显式处理父类异常,

方法的重写问题中异常问题:

子类重写方法,不能比父类中抛出更多异常。

具体情况:

当父类抛出编译时异常

  • 可以不抛出异常
  • 可以抛出一样的异常
  • 不能抛出不一样的编译时异常
  • 子类的重写方法可以抛出运行时异常

父类抛出运行时异常

  • 子类重写方法不能抛出Exception

  • 子类重写方法可以是让任何运行时的异常

  • 子类抛出编译时,多态调用时会对程序有影响。不能使编译时异常

    父类不抛出异常,子类重写方法不能抛出编译时异常。

在异常没有产生的时候,显式的抛出异常,是对调用者的警告。

throw

throw关键字一定会抛出一个异常对象

  • 编译时异常的throw 一般配合throws使用

两种异常的处理方式

从使用代码上:

运行时异常:一般出现了优化代码即可

编译时异常:出现了,就尽量try catch自己处理,或者抛出去。

throw和throws的区别

  1. 从使用位置上

    • 一个在方法声明中,一个在方法体内
  2. 从作用上

    • throws表示可能抛出的异常种类,throw时一定会抛出一个具体异常对象
  3. 从抛出个数上

    throws可以跟多个异常类名,用逗号隔开throw只能抛出一个确定的异常对象

  4. 从根本上
    throws表示抛出异常的一种可能性,并不一定会发生这些异常throw表示一定会抛出异常,只要是代码执行到这一句,一定会抛出

到底是该try 还是抛呢?

运行时异常:让异常出现,自己优化代码

编译时异常:try catch 处理。

自定义异常:

自定义异常步骤:

  1. 先写个异常类继承

继承RuntimeException :获得运行时异常

继承Exception:获得编译时异常

  1. 写一个有参构造方法,super(massage) 用来构造自定义异常的描述信息

  2. 在使用的地方抛出比如:

    // 只要i不是1就 丢出
    if (i != 1) {
        throw new NoOneException("不是1啊");
    }
    else{
        System.out.println("你是输入的时1");
    }
    
上一篇:【Java基础进阶笔记】- Day05 - 第二章 异常的处理


下一篇:异常