7.2 捕获异常
7.2.1 捕获异常
-
如果某个异常发生的时候没有在任何地方进行捕获,
那程序将终止执行,并在控制台上输出异常信息
-
捕获异常必须设置
try/catch
语句块try{ statements }catch(ExceptionType e){ handler for this type }
-
如果try语句块中任何代码抛出了一个在catch子句中说明的异常类,那么
- 程序将跳过try语句块的剩余代码
- 程序将执行catch子句中的处理器代码
-
如果在try语句块中没有抛出任何异常,那么程序将跳过catch子句
-
如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出
-
编译器严格执行
throws说明符
7.2.2 捕获多个异常
- 在一个try语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理
- 异常对象可能包含着域异常本身有关的信息.想要获得对象的更多信息,可以试着
Exception.getMessage()
得到详细信息,或者使用Exception.getClass().getName()
获得异常对象的实际类型 - 捕获多个异常时,异常变量隐含为
final变量
- 只有当捕获的异常类型批次之间不存在子类关系时,同一个catch才可以捕获多个异常类型
7.2.3 再次抛出异常与异常链
-
可以使用
Exception.getCause()
重新得到原始异常.try{ access the database }catch(SQLException e){ Throwable se=new ServletException("database error“); se.initCause(e)//将原始异常设置为新异常的原因 throw se; }
捕获异常后,可以使用
Throwable e=se.getCause()
重新得到原始异常.- 如果一个方法中发生了一个受查异常,而不允许抛出它,我们
可以捕获这个受查异常,并将它包装成一个运行时异常
- 如果一个方法中发生了一个受查异常,而不允许抛出它,我们
7.2.4 finally字句
- 不管是否有异常被捕获,
finally字句中的代码都将被执行
- 如果finally子句中也有一个return语句,这个返回值将会覆盖原始的返回值.
7.2.5 带资源的try字句
-
带资源的try语句(try-with-resources)
的最简形式:try(Resoureces = ...){ work with res }
-
try块退出时,会自动调用
res.closed()
7.2.6 分析堆栈轨迹元素
堆栈轨迹(stack trace)
是一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置.- 可以调用
Throwable.printStackTrace()
方法访问堆栈轨迹文本描述信息 - 一种更灵活的方法时使用
getStackTrace方法
,它会得到StackTraceElement
对象的一个数组 StackTraceElement类
含有能够获得文件名和当前执行的代码行号的方法,同时还含有能够获得类名和方法名的方法.- 静态的
Thread.getAllStackTrace
方法,他可以产生所有线程的堆栈轨迹.
API | 所在包 | 描述 |
---|---|---|
Throwable(Throwable cause) Throwable(String message,Throwable cause) |
java.lang.Throwable |
用给定的“原因”构造一个Throwable对象 |
Throwable initCause(Throwable cause) |
java.lang.Throwable |
将这个对象设置为”原因”.如果这个对象已经被设置为“原因”,则抛出一个异常.返回this引用 |
Throwable getCause() |
java.lang.Throwable |
获得设置为这个对象的”原因”的异常对象.如果没有设置”原因”,则返回null |
StackTraceElement[] getStackTrace() |
java.lang.Throwable |
获得构造这个对象时调用堆栈的跟踪 |
void addSuppressed(Throwable t) |
java.lang.Throwable |
为这个异常增加一个”抑制”异常.这出现在带资源的try语句中,其中t是close方法抛出的一个异常 |
Throwable[] getSupressed() |
java.lang.Throwable |
得到这个异常所有”抑制”异常.一般来说,这些是带资源的try语句中close方法抛出的异常 |
Exception(Throwable cause) Exception(String message,Throwable cause) |
java.lang.Exception |
用给定的”原因”构造一个异常对象 |
RuntimeException(Throwable cause) RuntimeException(String message,Throwable cause) |
java.lang.RuntimeException |
用给定的”原因”构造一个RuntimeException对象 |
String getFileName() |
java.lang.StackTraceElement |
返回这个元素运行时对应的源文件名.如果这个信息不存在则返回null |
int getLineNumber() |
java.lang.StackTraceElement |
返回这个元素运行时对应的源文件行数.如果这个信息不存在,则返沪-1 |
String getClassName() |
java.lang.StackTraceElement |
返回这个元素运行时对应的类的完全限定名 |
String getMethodName() |
java.lang.StackTraceElement |
返回这个元素运行时对应的方法名.构造器名 |
boolean isNativeMethod() |
java.lang.StackTraceElement |
如果这个元素运行时在一个本地方法中,则返回true |
String toString() |
java.lang.StackTraceElement |
如果存在的话,返回一个包含类名、方法名、文件名和行数的格式化字符串 |