什么是异常
- 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误
- 在程序运行过程中,意外发生的情况,背离我们程序本身意图的表现,都可以理解为异常
异常分类
- Throwable
- Error
- OutOfMemoryError
- ThreadDeath
- …
- Exception
- 程序本身可以处理的异常
- unchecked exception (runtime exception)
- NullPointerException
- ArrayIndexOutOfBoundsException
- …
- checked exception
- IOException
- SQLException
- …
- Error
捕获异常
- 对于运行时异常,错误或可查异常,Java技术所要求的异常处理方式有所不同
- 对于可查异常必须捕捉,或者声明抛出
- 允许忽略不可查的RuntimeException 和 Error
异常处理
- 通过5个关键字来实现: try, catch, finally, throw, throws
捕获异常
- try: 执行可能产生异常的代码
- catch: 捕获异常
- finally: 无论是否发生异常,总是执行的代码
声明异常
- throws: 声明可能要抛出的异常
抛出异常
- 手动抛出异常
try catch finally
- try之后可以接零个或多个catch, 如果没有catch,则必须接一个finally
throw throws
- 可以通过throws声明将要抛出何种类型的异常, 通过throw将产生的异常抛出
throws
- 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常
- throws语句用在方法定义时,生命该方法要抛出的异常类型
- 当方法抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常做处理,而抛向方法的调用者,由它去处理
1 | public int divideIntegers(int a, int b) throws Exception { |
throw
- throw用来抛出一个异常
- 抛出的只能够是可抛出类throwable或者其子类的实例对象
- 自己抛出的异常,自己处理
- 抛出异常使用throws由调用者处理
自定义异常
- 使用Java内置的异常类可以描述在编程时出现的大部分异常情况
- 也可以通过自定义异常描述特定业务产生的异常类型
- 自定义异常就是定义一个类,去继承Throwable类或者它的子类
1 | public class CustomException extends Exception { |
异常链
-
有时候我们会捕获一个异常后再抛出另一个异常
-
顾名思义就是:将异常发生的原因一个穿一个穿起来,把底层的异常信息传给上层,这样逐层抛出
-
新的异常可以保留原有异常的信息
-
构造方法的定义如下
1 | Exception(String mesasge, Throwable cause) |
1 | public void methodOne() throws FirstException { |