Error和Exception

异常的结构

在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)

Throwable:Error(错误)和 Exception(异常)就是 Throwable 的子类

在这里插入图片描述

Error 和 Exception 最大的区别是:Exception 可以被程序本身所处理,而 Error 程序本身无法所处理
Error(错误)

是程序本身无法处理的错误,是不可查异常,通常表示运行应用程序出现的严重问题,大多数都是和程序编写者执行的操作无关,通常表示 JVM 出现的问题,例如:Java虚拟机运行错误,当为对象申请的内存空间超过JVM内存限制时,就会抛出 OutOfMemoryError,当异常发生JVM 就会终止线程的执行

Exception(异常)

程序本身可以处理的异常
其中 Exception 又分为两大类:运行时异常和编译异常

运行时异常:

就是 RuntimeException 以及它的子类,常见的 RuntimeException 有:空指针异常,数组下标越界,算数异常,类型转换异常等,这些 RuntimeException 是不可查异常,即使没有用 try catch 捕获或者 throws 抛出异常,编译器也可以允许它运行

编译异常:

除了 RuntimeException 和它的子类之外的 Exception 都是编译异常,例如 IOException ,不允许访问异常,方法未找到异常,字段未找到异常等,编译器会检查这部分异常,如果存在这部分的异常但是不捕获或者抛出异常,那么编译器不允许通过

Java中的 Throwable 主要分为:可查异常(checked Exception)和不可查异常(unchecked Exception)

在这里插入图片描述

可查异常:

很容易出现的异常情况,Exception 中除了 RuntimeException 和它的子类外都是可查异常,特点是,可查异常会被编译器所检查,必须通过异常捕获或者异常抛出才能够正常编译,否则编译不通过

不可查异常:

主要包括 Error 和 RuntimeException ,特点是,这部分异常不会被编译器检查,可以不捕获或者抛出就通过编译,发生这部分异常通常是因为编写的程序问题,需要找出程序本身的错误并且修改,而不是去捕获和抛出

异常处理机制
捕获异常

当一个方法中出现异常错误时,方法会创建异常对象并且把这个异常对象交付给运行时系统处理,异常对象中包括了异常类型和异常程序运行时的状态,就由运行时系统寻找能够处理异常的代码并且执行
通过 try catch 来捕获异常

try {  
	// 可能会发生异常的程序代码  
} catch (Type1 id1){  
	// 捕获并处置try抛出的异常类型Type1  
} catch (Type2 id2){  
	 //捕获并处置try抛出的异常类型Type2  
}

try 括号部分包裹起来的区域就称为监控区域,当程序运行过程中,如果监控区域发生异常错误,那么方法会生成异常对象并且抛出监控区域,交给运行时系统处理,运行时系统就会在 catch 语句中寻找能够匹配处理的 catch 语句
(1)一旦匹配到能够处理异常的 catch 语句,那么整个 try catch 语句就会终止,不会再去匹配其他 catch 语句
(2)如果运行时系统在 catch 语句中找不到能够处理的 catch 语句,则会将异常抛出交给 JVM 处理
try-catch-finally语句

try {  
	// 可能会发生异常的程序代码  
} catch (Type1 id1){  
	// 捕获并处置try抛出的异常类型Type1  
} catch (Type2 id2){  
	 //捕获并处置try抛出的异常类型Type2  
}finally {  
	// 无论是否发生异常,都将执行的语句块  
}
try、catch、finally语句块的执行顺序:

(1)如果在 try 语句中没有捕获异常,那么 try 语句中的代码逐一的执行,并且跳过 catch 语句,执行 finally 语句和后面的语句
(2)如果 try 语句中捕获到异常,运行时系统会去 catch 语句中寻找能够处理异常的 catch 语句,如果 catch 语句都不能够处理异常,那么会将异常抛出交给 JVM 处理,之后也会执行 finally 语句,但是其后面的语句不会执行
(3)如果 try 语句捕获异常,并且能够在 catch 语句中处理异常,匹配到 catch 语句后,其他 catch 语句就不会被执行,并且 try 语句从异常出现之后的语句也不会被执行,之后会执行 finally 语句和其之后的语句

注意:finally 语句并不一定会被执行,发生以下这些情况时,就不会执行 finally 语句

(1)finally 语句发生异常
(2)前面的代码块中使用 System.exit(0) 退出程序
(3)程序所在的线程死亡
(4)CPU关闭

抛出异常

如果一个方法可能会出现异常,但是自身没有能力处理异常,那么可以在方法声明处使用 throws 子句来抛出异常,例如
throws exception ,就表明该方法抛出所有的异常,不同异常之间通过逗号分隔开来
Throws 抛出异常规则:
(1)如果是Error 或者 RuntimeException 以及它的子类这种不可查异常,那么即使不使用 throws 抛出异常,编译器也可以正常执行,会在运行发生异常时由系统将异常抛出
(2)当方法抛出异常时,方法的调用者应该处理异常,如果调用者也没有能力处理异常就应该继续向上抛出

可以在方法体中使用 throw 语句来抛出一个 Throwable 异常,程序在 throw 抛出异常后就会立即终止

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值