网站首页 > java教程 正文
享学特邀作者:老顾头条号id:老顾聊技术
前言
小伙伴们对Java的异常应该是不陌生的,不过很多人只是简单的应用而已,而没有全面的,整体的去了解Java的异常体系。今天老顾就来跟大家一起学习JAVA的异常。
3W原则
哪都有的3W原则,JAVA异常也可以总结3W:what、where、why
what对应异常类型:回答了什么被抛出where对应异常堆栈跟踪:回答了在哪抛出why对应异常信息:回答了为什么被抛出
异常体系
上图我们看出Throwable是异常的顶级类,Error和Exception是他的子类。Exception又分RuntimeException和非RuntimeException子类。
Error与Exception区别
我们看一下他们的概念定义:Error:程序无法处理的系统错误,编译器不做检查。
Error表示系统致命的错误,程序没法处理。一般是与JVM相关的问题,如系统崩溃,内存溢出,方法调用栈溢出等,如:经常遇到的StackOverflowError、OutOfMemoryError。这种类型的错误,编译器不做检查,都是系统运行过程中发生的。这些错误靠我们程序本身是无法处理与预防的,遇到了建议直接程序中止、重启。
Exception:程序可以处理的异常,捕获后可处理。
Exception异常是程序能够捕获的,也可以做异常处理,我们要尽可能的去处理,使程序继续运行,而不是中止程序。
总结一下就是Error是程序无法处理的错误,Exception是可以处理的异常。
RuntimeException与否区别
上图中Exception有两种类型的异常,我们来看一下RuntimeException:不可预知的,程序应当自行避免
何为不可预知?如:数组下标越界,访问对象空指针等,这种异常是我们小伙伴们在编写程序时要尽量避免。也就是我们程序员是能够避免的。如针对空指针异常,我们应该在编程的时候,加上空指针判断,if(obj == null) 如何如何,这样就避免了空指针异常。
非RuntimeException:可预知的,编译器可检查的异常
可预知,如:在我们打开一个文件时,如文件不存在引用的异常。这种异常编译器会检查出来,必须需要处理的。这个也称之为Checked Exception异常类型
责任归属
我们从责任角度看:
1、Error属于JVM需要承担的责任 2、RuntimeException是程序应该承担的责任 3、非RuntimeException(CheckedException)可检查异常是JAVA编译器应该承担的责任
上面代码直观一点:
我们看到Error和RuntimeException编译器是不检查的,而CheckedExcepton异常编译器是检查的,也就是我们程序员是必须要捕获处理的。那怎么处理呢?
1、try-catch方式
用try-catch方式捕获这个异常,可以在catch代码段进行异常逻辑处理,这个就按照实际业务而定。如上图代码是FileNotFound异常,根据这个类型我们就知道是文件句柄不存在,那我们应该做哪些处理。如:提示一下用户该文件不存在
2、上抛异常方式在复杂的业务中,我们的程序员自己写的模块,很有可能被其他程序员写的模块进行引用,为了能够让其他程序员知道我们模块的异常,并要他们要进行处理,我们就可以采用上抛异常方式
我们看一下上层调用的处理
我们看到上抛异常,是需要调用方进行处理的。那处理的方式是什么呢?其实就是上面讲的try-catch或继续上抛。
常见的Error和Exception
一、RuntimeException
1、NullPointerException - 空指针引用异常2、ClassCastException - 类型强制转换异常3、IllegalArgumentException - 传递非法参数异常4、IndexOutOfBoundsException - 下标越界异常5、NumberFormatException - 数字格式异常
二、非RuntimeException
1、ClassNotFoundException - 找不到指定class异常2、IOException - IO操作异常
三、Error
1、NoClassDefFoundError - 找不到class定义的异常2、StackOverflowError - 深递归导致栈被耗尽抛出的异常3、OutOfMemoryError - 内存溢出异常
总结
今天老顾介绍了异常的相关知识,这点在我们系统开发时是非常重要的,尤其在我们设计系统时,要定义我们系统自己的异常,这个需要整体规划异常类型、异常Code、异常信息等,能够起到很好的排查问题,并方便捕获处理。
小疑惑
在捕获异常时,用到try-catch,会经常用到finally关键字,小伙伴应该都知道这个是保证代码一定会被执行,如:关闭JDBC链接、保证锁unlock等。那小伙伴们猜猜下面两段代码执行结果是什么?代码一:
代码二:
小伙伴,可以把答案写在留言板中。谢谢!!!
进入小程序留言板
猜你喜欢
- 2024-10-06 Java中的异常(java中的异常是什么)
- 2024-10-06 Java 异常处理(java异常处理关键字)
- 2024-10-06 Java基础:异常捕获与处理,防患于未然
- 2024-10-06 「每日一面」java异常处理(java异常处理步骤)
- 2024-10-06 深入理解java异常处理机制,程序员们会了吗
- 2024-10-06 JAVA这样来处理异常(java 处理异常)
- 2024-10-06 太简单了!这套Java异常处理的总结,80%的人都没看过
- 2024-10-06 “全栈2019”Java异常第十七章:Error详解
- 2024-10-06 Java学习:Java中的异常(java中的异常是什么)
- 2024-10-06 详解Java异常(java异常处理规则(新手必看))
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)