1. 概述
以下是详细内容
2. 什么是异常
编程的错误分为语法错误、逻辑错误、异常三种,其中语法错误和逻辑错误不属于异常。因为如果发生语法错误,Java程序根本无法运行,而如果发生逻辑错误,Java程序也不可能得到正确的结果。
我们说的异常是指程序既没有语法错误,也没有逻辑错误,而是在运行过程中遇到一些程序意外的错误,导致Java程序发生异常,从而导致Java程序崩溃。
我们在编程过程中,就是要尽量考虑到这些异常情况,并编写合理的异常处理代码,这样即使程序发生异常,也不会导致程序崩溃。
3. 异常的分类
对于一些程序意外的错误,一般有两种解决方法
- 一种是遇到错误就终止程序的运行
- 另一种是程序员在编写程序时,就先考虑错误的检测、错误消息的提示,以及错误的处理
Java将程序执行时可能发生的错误(Error
)或异常(Exception
),都封装成了类,作为java.lang.Throwable
的子类,即Throwable
是所有错误(Error
)或异常(Exception
)的超类。
- 错误 (
Error
) : 指的是Java虚拟机无法解决的严重问题,一般不编写针对性的代码进行处理。 - 异常 (
Exception
) : 指其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
注 : 除了Error
和RuntimeException
及其子类属于非异常>受检异常类型,剩下的都是异常>受检异常类型,包括Throwable
和Exception
两个类型本身。具体如下图所示 :
4. 异常处理
Java处理异常有以下三种方式
4.1 try-catch-finally
Java
中的异常对象,可以通过try-catch
结构进行捕获处理
java">try {//do something
} catch (Exception e) {e.printStackTrace();
} finally {//无论是否发生异常,都一定会执行finally//比如IO流的关闭、网络连接的断开等代码,这就需要使用finally块
}
当程序中的某段代码可能发生异常时,可以用try结构进行包围。
如果try结构中的代码没有发生异常,那么程序将正常运行万try结构中的代码,不会理会任何catch分支。
但是,如果try结构中的代码发生了异常,则首先会中断try结构中剩下代码的执行,并抛出对应的异常对象,交由catch分支去由上到下匹配执行。此时如果所有catch分支都不匹配,那么相当于该异常没有被捕获到,自动抛给调用方来处理。
而finally 分支,无论是否发生异常,都一定会执行。比如IO流的关闭、网络连接的断开等代码,这就需要使用finally块。
4.2 关键词 throws
如果某段代码可能发生异常,并且也非常清楚如何处理该异常,那么使用try-catch结构是最直接的。
但是有时候,在当前方法中,无法确定如何处理该异常,那么可以将throws(异常信息)抛给上一级处理。
(就如同现实生活中,自己处理不了的问题,上升到上级领导处理)
4.3 自定义异常类型
Java
规定异常或错误的类型必须继承自现有的Throwable
或其子类。
通常我们会继承Exception
(异常>受检异常)或RuntimeException
(非异常>受检异常)
java">public class MyException extends Exception {public MyException() {}public MyException(String message) {super(message);}
}
注意 : 自定义异常对象只能通过throw
语句手动抛出,之后才能通过try-catch
处理或throws
抛给调用方。
java">throw new MyException("具体报错提示XXXXXYYYY")
5. 异常信息的查看
当程序发生异常时,Java会抛出一个对应类型的对象,那么当控制台打印了一个异常对象的相关信息后,该如何查看呢 ?
Throwable getCause()
:获取引起异常的原因。String getMessage()
:获取异常的详细信息。void printStackTrace()
:用标准错误的样式打印异常类型、描述信息及堆栈跟踪信息。
6. 参考
《剑指Java》