Java try catch finally异常处理语句的用法(附带实例)
在程序设计和运行过程中,发生错误是不可避免的。为此,Java 提供了异常处理机制来帮助程序员检查可能出现的错误,保证程序的可读性和可维护性。
Java 语言的异常捕获结构由 try、catch 和 finally 这 3 部分组成。其中:
try、catch 和 finally 的语法格式如下:
程序中将可能出现异常的代码用 try catch 语句块进行处理,当 try 语句块中的语句发生异常时,程序就会跳转到 catch 语句块中执行,执行完 catch 语句块中的程序代码后,将继续执行 catch 语句块后的其他代码,而不会执行 try 语句块中发生异常语句后面的代码。由此可知,Java 的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
注意,有时为了编程简单会忽略 catch 语句后的代码,这样 try catch 语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良好的编程习惯,最好在 catch 语句块中写入处理异常的代码。
举个简单的例子:
但是,在以下 4 种特殊情况下,finally 块不会被执行:
Java 中常见的异常类如下表所示。
Java 语言的异常捕获结构由 try、catch 和 finally 这 3 部分组成。其中:
- try 语句块存放的是可能发生异常的 Java 语句;
- catch 语句块在 try 语句块之后,用来激发被捕获的异常;
- finally 语句块是异常处理结构的最后执行部分,无论 try 语句块中的代码如何退出,都将执行 finally 语句块。
try、catch 和 finally 的语法格式如下:
try { // 程序代码块 } catch(Exceptiontype1 e) { // 对 Exceptiontype1 的处理 } catch(Exceptiontype2 e) { // 对 Exceptiontype2 的处理 } ... finally { // 程序代码块 }通过异常处理器的语法可知,异常处理器大致分为 try catch 语句块和 finally 语句块。
Java try catch语句块
【实例】在项目中创建 Take 类,在主方法中使用 try catch 语句块将可能出现的异常语句进行异常处理。public class Take { // 创建类 public static void main(String[] args) { // 主方法 try { // try 语句块中包含可能出现异常的程序代码 String str = "lili"; // 定义字符串变量 System.out.println(str + "年龄是:"); // 输出的信息 int age = Integer.parseInt("20L"); // 数据类型转换 System.out.println(age); } catch (Exception e) { // catch 语句块用来获取异常信息 e.printStackTrace(); // 输出异常性质 } System.out.println("program over"); // 输出信息 } }运行结果为:
lili年龄是:
java.lang.NumberFormatException: For input string: "20L"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:658)
at java.base/java.lang.Integer.parseInt(Integer.java:776)
at Main.main(Main.java:6)
program over
程序中将可能出现异常的代码用 try catch 语句块进行处理,当 try 语句块中的语句发生异常时,程序就会跳转到 catch 语句块中执行,执行完 catch 语句块中的程序代码后,将继续执行 catch 语句块后的其他代码,而不会执行 try 语句块中发生异常语句后面的代码。由此可知,Java 的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
注意,有时为了编程简单会忽略 catch 语句后的代码,这样 try catch 语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良好的编程习惯,最好在 catch 语句块中写入处理异常的代码。
Java finally语句块
完整的异常处理语句一定要包含 finally 语句,无论程序中有无异常发生,并且无论之前的 try catch 语句块是否被顺利执行完毕,都会执行 finally 语句。举个简单的例子:
public class FinallyExample { public static void main(String[] args) { try { // 尝试打开一个不存在的文件 java.io.FileWriter writer = new java.io.FileWriter("nonexistent.txt"); writer.write("This will not be written."); } catch (java.io.IOException e) { // 捕获并处理异常 System.out.println("An error occurred."); } finally { // 无论是否发生异常,都会执行这里的代码 System.out.println("This is the finally block. It will always be executed."); } System.out.println("This line is always executed after the try-catch-finally block."); } }在这个例子中:
- 尝试打开一个不存在的文件 nonexistent.txt 并写入数据。这将引发 IOException。
- 异常被捕获并处理,打印出 "An error occurred."。
- 无论是否发生异常,finally 语句块中的代码都会执行,打印出 "This is the finally block. It will always be executed."。
- 最后,程序继续执行,打印出 "This line is always executed after the try-catch-finally block."。
但是,在以下 4 种特殊情况下,finally 块不会被执行:
- 在 finally 语句块中发生了异常;
- 在前面的代码中使用了 System.exit() 退出程序;
- 程序所在的线程死亡;
- 关闭 CPU。
Java常见的异常类
在 Java 中,提供了一些异常类用来描述经常发生的异常。其中,有的需要程序员进行捕获处理或声明抛出,有的是由 Java 虚拟机自动进行捕获处理的。Java 中常见的异常类如下表所示。
异常类 | 说明 |
---|---|
ClassCastException | 类型转换异常 |
ClassNotFoundException | 未找到相应类时抛出的异常 |
ArithmeticException | 算术异常 |
ArrayIndexOutOfBoundsException | 数组下标越界时抛出的异常 |
ArrayStoreException | 数组中包含不兼容的值时抛出的异常 |
SQLException | 操作数据库时抛出的异常 |
NullPointerException | 空指针时抛出的异常 |
NoSuchFieldException | 字段未找到时抛出的异常 |
NoSuchMethodException | 方法未找到时抛出的异常 |
NumberFormatException | 字符串被转换为数字时抛出的异常 |
NegativeArraySizeException | 数组元素个数为负数时抛出的异常 |
StringIndexOutOfBoundsException | 字符串索引超出范围时抛出的异常 |
IOException | 输入输出异常 |
IllegalAccessException | 不允许访问某类时抛出的异常 |
InstantiationException | 当应用程序试图使用 Class 类中的 newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常 |
EOFException | 文件已结束时抛出的异常 |
FileNotFoundException | 文件未找到时抛出的异常 |