1.Java异常概述
即使在开发过程中,无论多完美的代码,在系统运行过程中,仍然会遇到一些问题,因为很多问题并不是只靠代码就能避免的, 比如网络是否通畅,读取文件是否存在等。所以我们在编写代码的过程中,使用异常处理可以帮助我们更优雅地处理这些问题,并采取适当的措施,而不至于导致程序崩溃或产生未知的行为。
2.异常的分类
在 Java 中,异常被分为两种类型:
已检查异常(Checked Exceptions)和 未检查异常(Unchecked Exceptions)。
-
已检查异常(Checked Exceptions):
- 这些异常必须在方法的声明中显式地进行处理,否则编译器会报错。这样的异常通常是由外部因素引起的,如文件找不到、网络连接中断等。
- 例如:
IOException
,FileNotFoundException
,SQLException
等。
-
未检查异常(Unchecked Exceptions):
- 这些异常通常是由程序错误导致的,无法在编译期捕获,因此不需要在方法中显式地处理。
例如:NullPointerException
,ArrayIndexOutOfBoundsException
,ClassCastException
等。
3.异常处理
Java 提供了以下几种关键字用于处理异常:
-
try:用于将可能抛出异常的代码块包装起来。
-
catch:用于捕获特定类型的异常并进行处理。
-
finally:无论是否发生异常,都会执行的代码块。
-
throw:用于手动抛出异常。
-
throws:用于声明方法可能抛出的异常,由调用者来处理。
4.代码示例
基本语法:
try{
//可能会发生异常的代码
}catch(异常类型 引用名){
//异常处理代码
}finally{
//必须执行代码
}
示例:
import java.io.*;
public class ExceptionHandlingExample {
public static void main(String[] args) {
FileReader file = null;
try {
file = new FileReader("file.txt");
// 读取文件内容
} catch (FileNotFoundException e) {
System.out.println("文件未找到");
e.printStackTrace();
} finally {
try {
if (file != null) {
file.close();
}
} catch (IOException e) {
System.out.println("无法关闭文件");
e.printStackTrace();
}
}
}
}
在这个例子中,我们尝试打开一个文件("file.txt"),如果文件不存在,则会抛出 FileNotFoundException
。在 catch
块中,我们捕获这个异常并处理它。在 finally
块中,我们确保无论是否发生异常,文件都会被关闭。
5. 注意事项
-
捕获精确的异常:尽量不要捕获过于宽泛的异常,而是应该捕获特定类型的异常。
-
避免空的 catch 块:如果不知道如何处理异常,可以将异常传播到调用者,或者至少记录异常信息以便调试。
-
使用 finally 块:确保资源在使用完毕后被正确地释放,即使发生异常也能够执行必要的清理工作。
-
避免过度异常处理:不应该将整个代码块包裹在一个巨大的 try-catch 块中,而是应该将异常处理集中在需要处理异常的地方。