前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8编程精粹 - 异常的“第一次”

Java8编程精粹 - 异常的“第一次”

原创
作者头像
JavaEdge
修改2020-06-11 14:23:02
3350
修改2020-06-11 14:23:02
举报
文章被收录于专栏:JavaEdge

Throwable 表示任何可以作为异常被抛出的类。

Throwable 的子类对象分为两种

  1. Error,编译期和系统错误,除特殊情况,一般不用SE关心
  2. Exception,可被抛出的基本类型,在 Java 类库、用户方法以及运行时故障中都可能抛出 Exception 型异常。所以 Java 程序员关心的基类型通常是 Exception。

Java 中异常的数目在持续增加,罗列它们是毫无意义的。而且第三方框架也可能会有自己的异常。因此对于异常,关键是理解概念以及如何使用它们。

异常的基本概念

异常是用名称代表发生的问题,最好可以望文知意。

异常并非全是在 java.lang 包里定义,其实有很多:

尤其是所有的输入/输出异常都继承 java.io.IOException。

特别的 RuntimeException

如果对传递给方法的每个引用都检查是否为 null,这也太恶心了。如下所示:

但其实不必亲自做,因为这是 Java 运行时检查的一部分。如果调用 null 引用,Java 会自动抛 NPE,所以上述代码其实多余。

属于运行时异常的类型有很多,会自动被 JVM 抛出,这些异常都继承于 RuntimeException,构成了一组具有相同特征和行为的异常类型。

也不需要在异常说明中声明方法将抛出 RuntimeException 类型的异常,因为它们也是“不受检查异常”。这种异常属于错误,将被自动捕获,不用亲自动手。尽管不用捕获,但还是可以编码抛出 RuntimeException异常。

编程错误

RuntimeException 代表编程错误:

  1. 无法预料的错误。比如 null 引用
  2. 应该在代码中检查的错误。(比如 ArrayIndexOutOfBoundsException,注意数组大小)

它们方便调试定位代码错误地方。

不捕获运行时异常

编译器没有在这个问题上对异常进行强制检查,RuntimeException 类型异常也许会穿越所有执行路径直达 main() ,而不被捕获。

要明白到底发生了什么,可以试试下面的例子:

如果 RuntimeException 没被捕获而直达 main(),那么在程序退出前调用printStackTrace() 方法。

RuntimeException是个特例,编译器不需要异常说明,其输出被报告给了 System.err。

只能在代码中忽略 RuntimeException类型的异常,因为所有受检查类型异常的处理都是由编译器强制实施的。

Java 的异常处理机制被设计用来处理一些烦人的运行时错误,这些错误往往是由代码控制能力之外的因素导致的;然而,它对于发现某些编译器无法检测到的编程错误,也是非常重要的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档