1、异常分类

从产生源头来看,Java语言中的异常可以分为两类:

JVM抛出的异常。比如:访问null引用会引发NullPointerException;0作为除数,如9/0,JVM会抛出ArithmeticException;内存消耗完,申请分配失败,JVM会抛出OutOfMemoryError。

注意:这些JVM的异常也可以在java代码中显式抛出(尽管我们很少这么做,基本也没有必要),如下例子中的代码可以正常编译。

public class Test {

public static void main(String []args){

String s = null;

if (s == null) {

throw new NullPointerException("Exception: s should not be null");

}

throw new OutOfMemoryError();

}

}

除了JVM的异常,其他异常都是程序引起的,是程序中显式通过throw语句抛出的。

比如,在Long.parseLong(String s, int radix)的源码中包含如下代码:

if (s == null) {

throw new NumberFormatException("null");

}

也就是说,方法会抛出NumberFormatException异常。

一般情况下,jvm异常是由jvm抛出的,不会被开发者显式抛出。当然,也可以在程序中通过throw语句显式抛出jvm异常。如下:

if (s == null) {

throw new NullPointerException(“s can not be null”);

}

所有的jvm异常都是unchecked,而程序中的异常则unchecked和checked都有。

2、异常类的继承层次

Java语言中的类继承层次如下图:

Java异常层次

Throwable有两个子类Exception和Error。其中:

Exception是和应用相关的,NullPointerException出现在当试图访问空对象的时候,ClassCastException出现在试图转换不兼容的类型时。可以通过try catch语句捕获Exception之后处理,可以让程序恢复运行。

Error是和应用运行的环境相关的,比如OutOfMemoryError出现在jvm内存耗尽的时候、StackOverflowError出现在栈溢出的时候。正因为如此,程序基本不可能在Error发生时恢复,所以,Error不能被try catch语句处理。

从这个图中可以看出,类也分为Checked异常和Unchecked异常。

Checked异常是java编译器强制处理的异常,必须通过try catch语句捕获,或者通过throws语句抛出。如果显式不处理,就会编译报错。比如网络连接失败的时候,会抛出IOException,程序应该提前预料并对这个异常做出恰当的处理,比如在网络中断时重新传输文件,这样程序才不会因为异常终止运行,崩溃挂掉。

Unchecked异常通常是开发者代码逻辑错误造成的:如NullPointerException(通常在程序设计时通过检查引用是否为空避免);如一些是java.lang.Error的子类,在任何一个实例对象创建的时候都有可能发生OutOfMemoryError(但是,我们不可能在每一个创建对象实例的地方都用try catch捕获这个异常,因为这个异常是unchecked,在实际编程中也无需这么做)。通常来说,unchecked异常是无法预料,编译器无法检测的异常。

3、checked和unchecked异常

自定义的异常是checked,还是unchecked取决于继承的父类是checked异常,还是unchecked异常。

try catch块中catch的checked异常,必须在try块中有出现这种异常的可能性,不然编译不通过。但是,Throwable和Exception这两个类有些特殊,尽管他们是checked异常,不过,即使在try块中没有出现该异常的可能性,依然可以捕获它们。因为他们都有unchecked异常子类(如RuntimeException),编译器不检查unchecked异常,也就允许这样捕获unchecked异常。

参考资料

JAVA语言异常,Java语言中的异常相关推荐

  1. java 异常 日志_java中的异常、断言、日志(一)

    1.Java异常处理i.异常的概念和Java里面的异常体系结构1)基本概念:程序中的异常,一般成为例外情况,可以理解为是非正常情况,其他编程语言里面也有这样的情况,Java里面同样存在这样一个体系结构 ...

  2. java 异常 理解_java中的异常理解

    java异常是java提供的用于处理程序中错误的一种机制. 所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在). 设计良好地程序应该在程序异常发生时提 ...

  3. Java Native Interface 六JNI中的异常

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...

  4. java runnable 异常_JAVA 线程中的异常捕获

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  5. c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)

    异常基本概念 异常处理就是处理程序中的错误,所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0退出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等) c语言中处理异常 两种方法: 使 ...

  6. java获取异常信息_Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  7. JAVA awt eventqueue_线程“AWT-EventQueue-1”中的异常java.lang.NullPointerException

    嗨,我收到错误 Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException at P6.itemSt ...

  8. java异常处理机制_Java编程中的异常机制

    本文旨在以初学者的角度来学习Java异常的知识,尽量简单,一些细枝末节的知识不会讲述,但不影响对知识的掌握. (比如try-catch可以嵌套,不太会这么用) 1.什么是异常 我们先举个例子 int ...

  9. python类型转换异常捕捉_Java中的异常

    异常的概念: 异常(exception也称例外)就是在程序运行过程中所发生的不正常的事情, 他会终止程序的运行. 1.所需的文件找不着 2.网络连接不通或者中断 3.算数运算符的错误参数 4.数组下标 ...

最新文章

  1. 率清华团队研发“天机芯”登《Nature》封面,他说类脑计算是发展人工通用智能的基石...
  2. 10 个最值得 Python 新人练手的有趣项目
  3. mysql oracle查询速度慢_oracle查看执行最慢与查询次数最多的sql语句
  4. IT主要在线学习网站
  5. Web实时通信,SignalR真香,不用愁了
  6. 黑苹果2k屏_一加手机屏幕新特性:120Hz、2K+ OLED、10bit
  7. tp5微信公众号获取用户openid_tp5+微信公众号获取用户基本信息
  8. 客户端渲染(CSR)
  9. Torch 的安装与基本用法
  10. 软件体系架构课后作业04
  11. 复制移动VMware Workstation虚拟机文件产生的问题【转】
  12. 四叶草配置工具Clover Configurator for Mac
  13. win10怎么修复网络连接服务器失败,微软发布修复补丁修复Win10无网络连接问题...
  14. PID控制理解及口诀
  15. 物联网应用层的关键技术有哪些
  16. 当生命科学遇上AI,会产生怎样1+1>2的效果?
  17. vidda系统+android系统,海信电视精简教程,去除电视多余应用,换桌面!
  18. FinClip 3 月产品小报:新功能上线小程序一键生成 App
  19. 7-9 部落 (25分)
  20. KALI--入门教程--kali下载(vm),更新国内源,更换中文界面

热门文章

  1. Python GIL
  2. python中scrapy可以爬取多少数据_python中scrapy框架爬取携程景点数据
  3. Qt图形界面编程入门(5)
  4. python中双冒号的作用_python中双冒号
  5. pythonwhile循环怎么修改数据类型_python开发学习day05 (while循环; for循环; 数字类型操作)...
  6. Ubuntu下的提示信息彩色显示
  7. c#补充print(多态性问题)【C#】
  8. SQL Server如何链接到 Oracle并查询其中的数据?并实现做接口
  9. CentOS忘记普通用户密码解决办法
  10. Spring实战——通过Java代码装配bean