文章目录
Java异常
1.1异常概述
- 什么是异常
异常就是程序出现不正常的情况。程序在执行过程中,出现非正常的情况,最终会导致JVM的非正常停止。
注意:语法错误不算在异常体系中
Throwable包括Error和Exception两个子类。Error严重问题,通过代码无法处理。比如:内存溢出。Exception包括RuntimeException及子类 和 编译时期异常。
简单来说,编译时异常就是在编译的时候出现的异常;运行时异常就是在运行的时候出现的异常。
1.2异常处理流程
- 当代码出现了异常,那么就会在这里创建一个异常对象
- 首先会看,程序中有没有自己处理异常的代码
- 如果没有自己处理异常的代码,会交给本方法的调用者处理
- 本方法,main方法的调用者是虚拟机,因此最终这个异常会交给虚拟机默认处理
JVM默认处理异常方案
1.将异常的名称、位置、原因等信息输出在控制台
2.停止程序的运行,哪里出现了异常就在哪里停止,出现异常下面的代码不会执行
1.3声明异常方式-throws
- 声明方式
throws 异常类名
- throws的处理流程
- 告诉调用者,你调用我,有可能会出现这样的异常
- 如果方法中没有出现异常,那么正常执行
- 如果方法中出现了异常,就将这个异常交给调用者处理 ,如果调用着没有处理,就交给的jvm默认处理
注意事项:如果声明的异常是一个运行时异常,那么声明的代码可以省略
如果声明的异常是一个编译时异常,那么声明的代码不可以省略
1.3抛出异常对象-throw
以前出现异常,虚拟机帮我们创建一个异常对象,抛给调用者。但是如果我们想自己创建一个异常对象如何些呢?
- 格式:
throw new 异常();
- 注意:这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用在执行了
1.3throws和throw的区别
throws和throw的区别
throws | throw |
---|---|
用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象 |
表示声明异常,调用该方法有可能会出现这样的异常 | 表示手动抛出异常对象,由方法体内的语句处理 |
1.4处理异常方式-try catch
-
定义格式
try { 可能出现异常的代码; } catch(异常类名 变量名) { 异常的处理代码; }
执行流程
- 程序从 try 里面的代码开始执行
- 出现异常,就会跳转到对应的 catch 里面去执行
- 执行完毕之后,程序还可以继续往下执行
注意
-
如果 try 中没有遇到问题,怎么执行?
会把try里面的语句全部执行,catch里面的语句不执行。接着执行try…catch下面的代码 -
如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
会在遇到问题的位置停止JVM的执行,catch会捕获看看有没有相应的异常,有的话执行对应catch的所有代码。没有的话相当于白写了try…catch,将异常对象交给JVM默认处理。 -
同时有可能出现多个异常怎么处理?
如果出现多个异常,写多个对应的catch捕获即可,如果出现子父类异常对象注意父类的异常类对象应该在子类异常类对象的下方。不然是执行不到子类的异常类对象的catch的。
1.5Throwable
- 常用方法
方法名 | 说明 |
---|---|
public String getMessage() | 返回此 throwable 的详细消息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
1.6自定义异常
-
- 定义异常类
-
- 有继承关系
-
- 提供空参构造
-
- 提供带参构造
-
代码实现
异常类
public class AgeOutOfBoundsException extends RuntimeException {
public AgeOutOfBoundsException() {
}
public AgeOutOfBoundsException(String message) {
super(message);
}
}
1.7总结
- 异常是不正常打断虚拟机的运行。
- 异常的执行流程,出现异常,如果没有手动创建异常对象,交给JVM创建。其次判断是否自行处理异常。没有的话交给JVM处理。
- 异常的处理方式有两种,一种交给调用者方式处理throws,另一种自己处理try…catch
- throws用在声明方法小括号后面,格式是throws 异常类名,throw用于方法内,用于自动创建异常对象,交给调用者来处理。
- 自定义异常需要有定义、继承、有参、空参构造四个条件。