09 异常处理
内容提要
本文讲解Java异常处理:Error是程序无法处理的致命错误,Exception可被处理,分为运行时异常与非运行时异常。介绍常见内置异常类及其方法,如getMessage、printStackTrace。演示try-catch-finally捕获异常、throw与throws抛出异常,以及JDK7起用try-with-resources自动关闭资源。
延伸解读
受检异常与非受检异常的使用考量
文章指出,非运行时异常(受检异常)必须被捕获或声明抛出,否则程序无法编译。这类异常通常表示外部资源或环境问题,如IOException、SQLException。而运行时异常(非受检异常)由程序逻辑错误引起,如空指针、数组越界,编译器不强制处理。文章建议尽量避免自定义受检异常,因为这会增加调用者的处理负担,除非确实需要强制调用者应对某种可恢复的条件。
finally块与try-with-resources的对比
文章通过示例说明,finally块中的代码无论是否发生异常都会执行,即使catch块中有return,finally也会在返回前执行。这常用于释放资源。但JDK 7引入了try-with-resources语法,可以自动关闭实现了AutoCloseable的资源,如文件流。相比手动在finally中关闭,try-with-resources更简洁且能避免资源泄漏,尤其当多个资源需要关闭时。文章示例展示了同时打开BufferedReader和BufferedWriter并自动关闭的用法。
异常处理中的常见方法及其用途
文章列出了Throwable类的几个常用方法:getMessage()返回异常详细信息;getCause()返回引发异常的原因;printStackTrace()将异常及其调用栈打印到标准错误流,便于调试;getStackTrace()返回栈帧数组,可用于自定义日志。这些方法帮助开发者定位问题。注意,捕获异常后调用printStackTrace()不会终止程序,而未捕获的异常会打印类似信息但导致程序终止。
Q&A
Java中Error和Exception有什么区别?
Error是程序无法处理的致命错误,如OutOfMemoryError,会导致JVM终止线程,不能被捕获处理。Exception是程序可以处理的异常情况,分为运行时异常和非运行时异常,程序应尽可能处理。
Java运行时异常和非运行时异常有什么不同?
运行时异常是RuntimeException及其子类,如NullPointerException,属于非受检异常,程序可以不处理,通常由逻辑错误引起。非运行时异常是Exception的其他子类,属于受检异常,必须显式处理(捕获或抛出),否则编译不通过,如IOException。
Java中常用的异常处理方法有哪些?
常用方法包括:getMessage()返回异常详细信息;getCause()返回异常原因;toString()返回简要描述;printStackTrace()打印异常及回溯栈到标准错误流;getStackTrace()返回栈帧数组;fillInStackTrace()填充当前调用栈。
Java中try-catch-finally是如何工作的?
try块包含可能抛出异常的代码,catch块捕获并处理特定异常,finally块无论是否发生异常都会执行,常用于释放资源。即使catch中有return,finally也会在返回前执行。
Java中throw和throws有什么区别?
throw用于在函数内部抛出一个异常实例;throws用于在函数定义上声明可能抛出的异常类型。受检异常必须被捕获或通过throws声明抛出。
Java的try-with-resources是什么?如何使用?
try-with-resources是JDK 7引入的语法,用于自动关闭资源。在try后的括号中声明和实例化资源(如BufferedReader),无论是否发生异常,资源都会在语句结束后自动关闭。catch块可以处理关闭资源时可能出现的异常。