|
|
51CTO旗下网站
|
|
移动端

阿里面试:关于Java的异常,你能说多少?

小伙伴们对Java的异常应该是不陌生的,不过很多人只是简单的应用而已,而没有全面的,整体的去了解Java的异常体系。今天老顾就来跟大家一起学习JAVA的异常。

作者:老顾聊技术来源:今日头条|2019-07-17 05:50

【大咖·来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》

小伙伴们对Java的异常应该是不陌生的,不过很多人只是简单的应用而已,而没有全面的,整体的去了解Java的异常体系。今天老顾就来跟大家一起学习JAVA的异常。

3W原则

哪都有的3W原则,JAVA异常也可以总结3W:what、where、why

  • what对应异常类型:回答了什么被抛出
  • where对应异常堆栈跟踪:回答了在哪抛出
  • why对应异常信息:回答了为什么被抛出

异常体系

阿里面试:关于JAVA的异常,你能说多少?

上图我们看出Throwable是异常的***类,Error和Exception是他的子类。

Exception又分RuntimeException和非RuntimeException子类。

Error与Exception区别

我们看一下他们的概念定义:

(1) Error:程序无法处理的系统错误,编译器不做检查。

  • Error表示系统致命的错误,程序没法处理。一般是与JVM相关的问题,如系统崩溃,内存溢出,方法调用栈溢出等,如:经常遇到的StackOverflowError、OutOfMemoryError。这种类型的错误,编译器不做检查,都是系统运行过程中发生的。
  • 这些错误靠我们程序本身是无法处理与预防的,遇到了建议直接程序中止、重启。

(2) Exception:程序可以处理的异常,捕获后可处理。

  • Exception异常是程序能够捕获的,也可以做异常处理,我们要尽可能的去处理,使程序继续运行,而不是中止程序。
  • 总结一下就是Error是程序无法处理的错误,Exception是可以处理的异常。

RuntimeException与否区别

阿里面试:关于JAVA的异常,你能说多少?

上图中Exception有两种类型的异常,我们来看一下。

(1) RuntimeException:不可预知的,程序应当自行避免

  • 何为不可预知?如:数组下标越界,访问对象空指针等,这种异常是我们小伙伴们在编写程序时要尽量避免。也就是我们程序员是能够避免的。
  • 如针对空指针异常,我们应该在编程的时候,加上空指针判断,if(obj == null)如何如何,这样就避免了空指针异常。

(2) 非RuntimeException:可预知的,编译器可检查的异常

  • 可预知,如:在我们打开一个文件时,如文件不存在引用的异常。
  • 这种异常编译器会检查出来,必须需要处理的。
  • 这个也称之为Checked Exception异常类型

责任归属

我们从责任角度看:

  • Error属于JVM需要承担的责任
  • RuntimeException是程序应该承担的责任
  • 非RuntimeException(CheckedException)可检查异常是JAVA编译器应该承担的责任

上面代码直观一点:

阿里面试:关于JAVA的异常,你能说多少?

们看到Error和RuntimeException编译器是不检查的,而CheckedExcepton异常编译器是检查的,也就是我们程序员是必须要捕获处理的。那怎么处理呢?

(1) try-catch方式

阿里面试:关于JAVA的异常,你能说多少?

用try-catch方式捕获这个异常,可以在catch代码段进行异常逻辑处理,这个就按照实际业务而定。如上图代码是FileNotFound异常,根据这个类型我们就知道是文件句柄不存在,那我们应该做哪些处理。如:提示一下用户该文件不存在

(2) 上抛异常方式

在复杂的业务中,我们的程序员自己写的模块,很有可能被其他程序员写的模块进行引用,为了能够让其他程序员知道我们模块的异常,并要他们要进行处理,我们就可以采用上抛异常方式

阿里面试:关于JAVA的异常,你能说多少?

我们看一下上层调用的处理

阿里面试:关于JAVA的异常,你能说多少?

我们看到上抛异常,是需要调用方进行处理的。那处理的方式是什么呢?其实就是上面讲的try-catch或继续上抛。

常见的Error和Exception

(1) RuntimeException

  • NullPointerException - 空指针引用异常
  • ClassCastException - 类型强制转换异常
  • IllegalArgumentException - 传递非法参数异常
  • IndexOutOfBoundsException - 下标越界异常
  • NumberFormatException - 数字格式异常

(2) 非RuntimeException

  • ClassNotFoundException - 找不到指定class异常
  • IOException - IO操作异常

(3) Error

  • NoClassDefFoundError - 找不到class定义的异常
  • StackOverflowError - 深递归导致栈被耗尽抛出的异常
  • OutOfMemoryError - 内存溢出异常

总结

今天老顾介绍了异常的相关知识,这点在我们系统开发时是非常重要的,尤其在我们设计系统时,要定义我们系统自己的异常,这个需要整体规划异常类型、异常Code、异常信息等,能够起到很好的排查问题,并方便捕获处理。

【编辑推荐】

  1. 新手可看!6个必须拥有的JavaScript库
  2. 干货分享:利用Java多线程技术导入数据到Elasticsearch
  3. Java中那些常用的json库性能比较,常见Json库用法示例代码
  4. 经常被面试官问到的JavaScript数据类型知识,你真的懂吗?
  5. JavaScript进阶问题列表
【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

Java面向对象编程

Java是当前最流行的程序设计语言之一。本书以Java最新版本Java SE5为基础,涵盖了Java SE5最新特性,由浅入深地介绍了Java SE5的主要内容。...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客