在 Java 中,异常处理是一种机制,用于处理在程序执行过程中可能出现的错误和异常情况。通过合理的异常处理,可以使程序在发生错误时进行适当的处理,增加程序的健壮性和可靠性。
Java 中的异常处理主要通过以下两种方式来实现:try...catch 和 throws。
下面主要介绍怎样通过 try...catch 语句来进行异常处理,try...catch 语句有三种形式:try…catch、try…catch…finally 或 try…finally 。
使用 try...catch 块可以捕获和处理异常,以下是 try...catch 块的基本语法:
try { // 可能抛出异常的代码 } catch (异常类型1 异常变量1) { // 处理异常的代码 } catch (异常类型2 异常变量2) { // 处理异常的代码 } finally { // 可选的finally块,用于执行清理操作,无论是否发生异常都会执行 }
详细说明:
(1)try 块中包含可能抛出异常的代码
(2)catch 块用于捕获并处理异常,catch 块可以处理特定类型的异常,也可以处理异常的父类类型。如果 try 块中的代码抛出了异常,那么会跳转到与之匹配的 catch 块进行处理。在 catch 块中可以对异常进行适当的处理,例如打印错误信息、记录日志、进行恢复操作等。一个 try 块可以有多个 catch 块,用于处理不同类型的异常。如果一个异常被 catch 块捕获并处理,那么程序会继续执行 catch 块之后的代码。
(3)finally 块是可选的,用于执行清理操作,无论是否发生异常都会执行。通常用于释放资源,例如关闭文件、数据库连接等。finally块中的代码会在try块中的代码执行完毕后执行,无论是否发生异常。
try…catch 语句块的语法格式如下:
try{ // 需要正常执行的语句 } catch(Exception e) { // 对异常进行处理的语句 }
详细说明:
(1)try 和 catch 是进行异常处理的关键字。
(2)try 和 catch 之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。
(3)catch 后的两个小括号内是程序需要处理的异常类型。
(4)catch 后的两个大括号内是对程序发生的异常进行处理的语句。
import java.net.MalformedURLException; import java.net.URL; public class Demo { public static void main(String[] args) { String url = "htp://www.hxstrive.com"; try { // 可能要抛出异常的代码块 URL obj = new URL(url); // ① System.out.println(obj); // ② } catch ( // 指定我们需要处理的异常类型 MalformedURLException e) { // 处理异常的代码 // 这里仅仅是在控制台输出错误提示信息 System.out.println("URL地址无效,地址:" + url); // ③ } } }
运行实例,输出如下:
URL地址无效,地址:htp://www.hxstrive.com
上面代码中,当 ① 位置的代码出现错误时会跳过 ②,及它后面的代码,直接进入 ③ 开始处理异常。
try…catch…finally 语句块的语法格式如下:
try{ // 需要执行的语句 } catch(Exception ex) { // 对异常进行处理的语句 } finally { // 一定会被处理的语句 }
详细说明:
(1)try、catch 和 finally 是进行异常处理的关键字。
(2)try 和 catch 之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。
(3)catch 后的两个小括号内是程序需要处理的异常类型。
(4)catch 后的两个大括号内是对程序发生的异常进行处理的语句。
(5)finally 后的两个大括号内的语句,不管程序是否发生异常都要执行。也就是说程序执行完 try 和 catch 之间的语句或执行完 catch 后两个大括号内的语句都将执行 finally 后的语句。因此 finally 语句块通常用于执行垃圾回收、释放资源等操作。
注意:在 Java 中进行异常处理时,应该尽量使用 finally 块进行资源回收,因为在 try...catch 的 finally 语句块中,不管程序是否发生异常,最终都会执行 finaly 语句块,因此可以在 finally 块中添加释放资源的代码,如:释放文件句柄、数据库连接等等。
import java.net.MalformedURLException; import java.net.URL; public class Demo { public static void main(String[] args) { String url = "htp://www.hxstrive.com"; try { // 可能要抛出异常的代码块 URL obj = new URL(url); System.out.println(obj); } catch ( // 指定我们需要处理的异常类型 MalformedURLException e) { // 处理异常的代码 // 这里仅仅是在控制台输出错误提示信息 System.out.println("URL地址无效,地址:" + url); } finally { System.out.println("释放资源"); } } }
运行实例,输出如下:
URL地址无效,地址:htp://www.hxstrive.com 释放资源
try…finally 语句块的语法格式如下:
try{ // 需要执行的语句 } finally { // 一定会被处理的语句 }
详细说明:
(1)try 和 finally 是进行异常处理的关键字。
(2)try 和 finally 之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。
(3)finally 后两个大括号内的语句是不管程序是否发生异常最终都要执行的语句,因此 finally 语句块通常用于放置程序中必须执行的代码,如关闭数据库连接、关闭 IO 流等。
注意:在有 try…finally 语句块的程序中,只要程序执行了 try 语句块中的代码,不管 try 语句块是否发生异常,与该 try 语句块对应的 finally 语句块都一定会被执行,因此通常使用 finally 语句块进行资源释放。
public class Demo { public static void main(String[] args) { try { // 可能要抛出异常的代码块 float val = Float.parseFloat("string"); System.out.println("val=" + val); } finally { System.out.println("释放资源"); } } }
运行实例,输出如下:
Exception in thread "main" java.lang.NumberFormatException: For input string: "string" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122) at java.lang.Float.parseFloat(Float.java:451) at com.hxstrive.demo.Demo.main(Demo.java:9) 释放资源
上面代码中,及时抛出了异常,finally 块依然被执行了。