常见的异常 和 两种分类方式,一是从程序员的角度,二是根据API
异常的分类
- 在Java API中,每一种异常都使用相应的类来进行定义。所有异常类的根类是Throwable,该类在java.lang包中。
- 所有的Java异常类都直接或间接地从Throwable类继承。
- 可以通过继承Exception类或Exception的某个子类来创建自己的异常类。
异常有两种分类方法
一、根据JAVA API 的角度
- 分为错误 和 异常
二、根据编程开发的角度
- 分为 非检查异常(unchecked exception) 和 必检异常(checked exception)
错误 与 异常
- 错误是由Java虚拟机抛出的,其对应的类是Error类
Error类描述的是内部系统错误,这样的错误很少发生。如果发生了Error,一般除了通知用户以及尽量稳妥地终止程序之外,其它几乎什么也做不了。
常见的Error
- Java内存溢出 OutOfMemoryError。
- 程序中有死循环或方法的无限递归调用 StackOverflowError(堆栈溢出错误)
- 异常是用Exception类表示的
它描述的是由程序和外部环境所引起的错误,这些错误能够被程序捕获和处理。
- Exception类有一个重要的子类,就是RuntimeException类
- RuntimeException类通常是由Java虚拟机抛出的。
- 常见的RuntimeException
1.空指针异常 NullPointerException
2.数组下标越界异常
ArrayIndexOutOfBoundsException
3.数学运算中除以0的情况 ArithmeticException
4.传递给方法的参数非法或不合适 IllegalArgumentException
- 常见的异常
1.试图使用一个不存在的类 ClassNotFoundException
2.在读取文件时产生的异常 IOException
3.访问关系数据库类产生的异常 SQLException
非检查异常(unchecked exception) 和 必检异常(checked exception)
- 所有的Error、RuntimeException及其子类都属于 unchecked exception 非检查异常
- 其他异常属于 checked exception 必检异常
如:使用数组时,对可能会产生的数组下标越界异常或超大数组分配失败导致的内存溢出错误,编程时都不需要额外进行处理。
因为 下标越界
ArrayIndexOutOfBoundsException属于RuntimeException,而内存溢出OutOfMemoryError则属于Error。
非检查异常与必检异常对编程的影响
以访问关系数据库的Java程序为例
- 如果用传统的 JDBC 技术来访问关系数据库,产生的异常是 SQLException
该类在 java.sql 包中。该异常类属于 checked exception,因此编程时,一般必须明确使用 try‐catch‐finally 结构来处理该异常。
在有些情况下,进行异常处理的代码行数甚至会超过完成具体功能本身的代码行数
- 如果使用某种ORM框架,如Hibernate框架
- 在Hibernate框架中,定义了数量众多的数据库访问异常类,这些异常类构成了Hibernate框架的异常体系。
- Hibernate异常体系中的异常类都是从HibernateException类继承得到的,该类在org.hibernate包中。该异常类的父类是PersistenceException,该类在 javax.persistence 包中,该类的直接父类就是 RuntimeException。
- 因此,Hibernate异常体系中的异常类和 SQLException 类不同,他们都属于 unchecked exception,因此,不需要必须使用 try‐catch 结构来进行异常处理。
- 如果使用现在火热的Spring框架
- 在使用Spring框架访问关系数据库时,抛出的异常都是与特定技术无关的DataAccessException类的子类,该异常类在org.springframework.dao包中。
- DataAccessException类是RuntimeException类的子类,属于unchecked exception,因此,也不需要必须使用 try‐catch 结构处理或使用 throws 进行声明。
从上面可以看出
- 在传统的 JDBC 技术中,由于SQLException类属于checked exception,因此一般都需要使用 try‐catch 进行异常处理。
- 而使用 Hibernate 或者 Spring框架时,由于 HibernateException 和DataAccessException都属于 unchecked exception,因此不需要使用 try‐catch 进行异常处理,这大大简化了代码的编写工作,提高了编程效率,所得到的代码也更加简洁优美。
总结
- 从Java API的角度来看,主要分为Error和Exception两大类
- Exception类有一个非常重要的子类,就是RuntimeException。
- 从编程的角度来看
- 开发人员更加关注某种异常类是属于unchecked exception还是属于checked exception,后者需要明确使用try‐catch结构来进行处理,而前者则不需要。
上一篇:Java开发者必备的代码调试技巧
下一篇:Java开发中的异常处理艺 术