Java基础——异常体系
时间:2022-04-29
本文章向大家介绍Java基础——异常体系,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示:
所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,Error和Exception。
- Error错误:描述了Java运行时系统的内部错误和资源耗尽错误。一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理。因为如果出现这样的内部错误,除了通告用户,并尽力使程序安全地终止之外,再也无能为力了。
- Exception异常:Java的异常分为两种,checked Exception(编译时异常)和 RuntimeException(运行时异常)。
- checked Exception(编译时异常): Java认为checked Exception都是可以在编译阶段被处理的异常,一般是IOException和SQLException。所以它强制程序处理所有的checked Exception,而RuntimeException无须处理,java程序必须显式处理checked Exception,如果程序没有处理,则在编译时会发生错误,无法通过编译。用try{...}catch{...}finally{...}进行处理或throw和throws抛出异常。
- RuntimeException(运行时异常):这些异常一般是由程序逻辑错误引起的,一般都是程序员的错,表示程序存在bug,所以,一般不需要进行异常处理,直接让程序停止,由调用者对代码进行修正。常见的有NullPointException,IndexOutOfBoundsException(下标越界异常),ClassCastException,ArithmeticException(算数运算异常,例如除数为0等),ArrayStoreException (向数组中存放与声明类型不兼容对象异常),NegativeArraySizeException(创建一个大小为负数的数组错误异常),NumberFormatException(数字格式异常)等
- 出现运行时异常后,系统会自动把异常一直往上层抛(不需要程序员在代码中抛出),一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
- 如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
- Java异常处理方法有:抛出异常,捕捉异常。主要依赖于try、catch、finally、throw、throws五个关键字。
- try:它里面放置可能引发异常的代码
- catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。
- finally:主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。只有finally块执行完成之后,才会回来执行try或者catch块中的return或throw语句,如果finally中使用了return或者 throw等终止方法的语句,则就不会跳回执行,直接停止。
- throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。
- throws:用在方法签名中,用于声明该方法可能抛出的异常
1 import java.io.IOException;
2
3 public class Test {
4
5 public static void main(String[] args) {
6 System.out.println("returning result is " + testException());
7 }
8
9 public static int testException(){
10 int i = 1 ;
11 try{
12 throw new IOException() ;
13 }catch(Exception e){
14 System.out.println("catch it !");
15 return i;
16 }finally{
17 i = 2 ;
18 System.out.println("finally ok") ;
19 System.out.println("i = " + i) ;
20 //return i ;
21 }
22 }
23 }
当第20行的return语句注释掉时,输出的结果是 catch it ! finally ok i = 2 returning result is 1 同时也表明如果try 或 catch 中有return语句,则在进入finally之前,Java的中间缓存变量机制已经将try 或 catch 中返回的结果进行了缓存,执行完finally中的语句后,直接将缓存结果return,而当finally中有return语句时,则直接return当前的结果即可。 当第20行的return语句没有注释掉时,输出的结果是 catch it ! finally ok i = 2 returning result is 2
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android中ListView的item点击没有反应的解决方法
- android 应用内部悬浮可拖动按钮简单实现代码
- 详解Android PopupWindow怎么合理控制弹出位置(showAtLocation)
- Android Studio 3.0上分析内存泄漏的原因
- Android 实现图片生成卷角和圆角缩略图的方法
- Android使用TextInputLayout创建登陆页面
- Android使用WebSocket实现多人游戏
- Android Studio多渠道打包套路
- Vue路由History模式分析
- Android开发调用WebService的方法示例
- Js中Array对象
- 享元模式
- 两两交换链表中的节点
- 模板方法模式
- read命令