Java 抛出异常与 finally 实例解析
异常简介
在程序运行过程中,有一些无法预知的情况可能会导致程序出现异常。Java 语言提供了异常机制用于处理程序出现的异常情况。当程序发生异常时,系统会自动抛出一个异常对象,程序可以通过捕捉异常对象并进行处理,从而解决异常情况。
在 Java 中,异常分为两种:运行时异常和受检异常。运行时异常一般指在程序运行过程中出现的异常,比如空指针异常、类型转换异常等。受检异常一般指需要在程序中显式捕获处理的异常,比如文件不存在异常、网络传输异常等。
抛出异常
在 Java 中,程序可以手动抛出异常。当程序出现异常情况时,可以使用 throw 语句抛出异常。以下是一个简单的抛出运行时异常的例子:
public class ThrowExample {
public static void main(String[] args) {
int age = -1;
if (age < 0) {
throw new RuntimeException("Age is less than 0");
}
System.out.println("Age is: " + age);
}
}
运行上面的代码会抛出一个 RuntimeException 异常并输出以下信息:
Exception in thread "main" java.lang.RuntimeException: Age is less than 0
at ThrowExample.main(ThrowExample.java:6)
finally 语句
在 Java 中,finally 语句用于定义一段必须执行的代码块。无论是否发生异常,finally 语句中的代码都会被执行。finally 语句一般放在 try-catch 块的最后面。
以下是一个 finally 语句的例子:
public class FinallyExample {
public static void main(String[] args) {
try {
int x = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("ArithmeticException: " + e.getMessage());
} finally {
System.out.println("Finally block executed");
}
}
}
运行上面的代码会抛出一个 ArithmeticException 异常并输出以下信息:
ArithmeticException: / by zero
Finally block executed
上面的代码中,try 块中执行了一个除 0 操作,导致抛出了一个 ArithmeticException 异常。因为存在 catch 块,所以程序会执行 catch 块中的代码并输出异常信息。无论是否出现异常,finally 块中的代码都会被执行,并输出相应的信息。
两个实例分析
实例 1
下面的代码演示了如何使用 try-catch 块和 finally 块来保证资源的释放。代码中创建了一个文件读取器,在读取文件之后需要将文件读取器关闭以释放资源。读取文件和关闭文件的操作都有可能会发生异常,所以需要在 try-catch 块中处理异常,并在 finally 块中释放资源。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReadExample {
public static void main(String[] args) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("test.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
}
}
}
}
}
上面的代码中,在 try 块中创建了一个文件读取器,并在 while 循环中逐行读取文件内容并输出。如果读取过程中出现异常,catch 块中会捕获异常并输出相应的信息。在 finally 块中判断文件读取器是否为空,如果不为空则关闭文件读取器以释放资源。
实例 2
下面的代码演示了如何通过多个 catch 块捕获不同类型的异常,并在 finally 块中清理代码块中使用的资源。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class MultiCatchExample {
public static void main(String[] args) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("test.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(Integer.parseInt(line));
}
} catch (NumberFormatException e) {
System.out.println("NumberFormatException: " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
}
}
}
}
上面的代码中,try 块中创建了一个文件读取器,并在 while 循环中读取文件的每一行并将其转换为整型数值并输出。因为读取的文件内容可能并不是整型数值,所以在 catch 块中同时捕获了整型转换异常和文件读取异常,并输出相应的信息。在 finally 块中释放了读取器占用的资源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java抛出异常与finally实例解析 - Python技术站