异常概述

指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.
语法问题 编译不通过
image.png
可以编译通过但是会报null异常
image.png
image.png

Throwable

是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
image.png

Error

内存溢出

系统崩溃

把代码更正就行
是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。
例如:(递归太深)

Exception

类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
image.png
Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好 比感冒、阑尾炎。

public void printStackTrace()

打印异常的详细信息。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

public String getMessage()

获取发生异常的原因。 提示给用户的时候,就提示错误原因。
异常处理:知道程序会出现异常但是可以使程序正常运行
image.png
printStackTrace()方法是两个方法的集合体
image.png

异常(Exception)的分类

编译时期异常checked异常

在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常) 代码中没有编译异常的时候不能直接抛出

只有编译异常才必须处理 运行时异常没必要处理

image.png

运行时期异常runtime异常

在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异 常)
image.png
编译时期异常checked异常异常必须需要try catch
image.png
下标越界异常处理
printStackTrace()处理之后就没必要打印了
image.png
如果没有设置异常处理,程序就会把异常交给jvm,jvm中断时处理会把异常都显示出来
image.png

异常处理

throw(用在方法内):创建一个异常对象封装一些信息,告知调用者出现异常

  1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。
  2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象。

image.png
类Objects:public static T requireNonNull(T obj) :查看指定引用对象不是null。
判断非空异常
image.png

throws(用于方法声明之上):当前方法不处理异常,要求调用者处理异常

关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
image.png
第一次中是编译异常是强制性的,将read方法出现的异常抛给main方法
最好的方法是捕获
抛给jvm虚拟机是个不明智的决定
image.png
运行异常没有强制性,可以处理可以不管,但是最后还是由jvm进行处理
image.png

捕获异常try…catch

如果异常出现的话,会立刻终止程序,所以我们得处理异常:

  1. 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
  2. 在方法中使用try-catch的语句块来处理异常。

try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
注意:try和catch都不能单独使用,必须连用。
image.png
有的时候不是在最底层处理异常就是最好的
在网页开发的时候需要把异常向上抛 呈现在客户眼前
image.png

finally 代码块

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行 不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
不论怎么处理异常 finally一定会执行
image.png

每当一句出现异常就会直接跳到catch语句

解决之后才会继续往下运行
而不是一次性出现多个异常
image.png
exception是所有异常的超类,不过首先捕获的是对应的异常
image.png
exception可以捕获任何异常 下面的异常就是不可达到的
父异常只能放在子异常的后面
image.png

父类抛出多个异常

如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常,不能抛出比父类更多更大的异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
image.png
抛出父类异常则不行
image.png

自定义异常

image.png
image.png
image.png
image.png
image.png

判断是编译异常还是运行时异常

除开runtimeException以及它的子类 其他的都是编译异常