第9天 Java基础学习:异常处理机制
学习目标
在本日的学习中,我们将深入研究Java中的异常处理机制,包括以下几个方面:
- 异常与错误分类
- try-catch-finally语句
- throw与throws关键字
- 自定义异常
一、异常与错误分类
Java中的异常主要分为两类:已检查异常(Checked Exception)和未检查异常(Unchecked Exception)。
1.1 已检查异常(Checked Exception)
- 定义:在编译时检查的异常,程序员必须主动处理。
- 示例:
IOException
,SQLException
异常类型 | 描述 | 示例 |
---|---|---|
IOException | 输入输出操作失败或中断 | 文件未找到或无法读取 |
SQLException | 数据库访问错误 | SQL语法错误,数据库连接失败 |
1.2 未检查异常(Unchecked Exception)
- 定义:在运行时检查的异常,通常是由于程序错误引起的。
- 示例:
NullPointerException
,ArrayIndexOutOfBoundsException
异常类型 | 描述 | 示例 |
---|---|---|
NullPointerException | 对空对象的引用 | 访问一个未初始化的对象 |
ArrayIndexOutOfBoundsException | 访问数组越界 | 访问数组的非法下标 |
1.3 错误(Error)
- 定义:指的是Java虚拟机无法处理的严重问题。一般不需要程序员处理。
- 示例:
OutOfMemoryError
,StackOverflowError
错误类型 | 描述 | 示例 |
---|---|---|
OutOfMemoryError | Java虚拟机内存不足 | 应用内存消耗过多 |
StackOverflowError | 调用栈溢出,通常由于递归调用过深 | 无限递归 |
二、try-catch-finally语句
try-catch-finally
语句用于处理可能引发异常的代码块,确保程序的正常执行。其结构如下:
try {// 可能引发异常的代码
} catch (异常类型 变量名) {// 异常处理代码
} finally {// 清理资源代码(可选)
}
2.1 例子:基本的try-catch使用
下面是一个示例,展示了如何使用try-catch
捕获异常:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class TryCatchExample {public static void main(String[] args) {BufferedReader reader = null;try {reader = new BufferedReader(new FileReader("test.txt"));String line = reader.readLine();System.out.println(line);} catch (IOException e) {System.out.println("发生了IOException: " + e.getMessage());} finally {try {if (reader != null) {reader.close();}} catch (IOException e) {System.out.println("关闭文件时发生异常: " + e.getMessage());}}}
}
2.2 多重catch的使用
可以在一个try块中捕获多种类型的异常,如下所示:
public class MultiCatchExample {public static void main(String[] args) {String str = null;try {// 可能引发异常的代码System.out.println(str.length());} catch (NullPointerException | ArrayIndexOutOfBoundsException e) {System.out.println("发生了异常: " + e.getClass().getSimpleName());}}
}
在上述例子中,NullPointerException
和ArrayIndexOutOfBoundsException
都可以被同一个catch块处理。
三、throw与throws关键字
3.1 throw关键字
throw
用于显式地抛出一个异常。其语法如下:
throw new 异常类型("异常信息");
例子:
public class ThrowExample {static void validateAge(int age) {if (age < 18) {throw new ArithmeticException("年龄不能小于18岁");} else {System.out.println("年龄验证通过");}}public static void main(String[] args) {try {validateAge(15);} catch (ArithmeticException e) {System.out.println(e.getMessage());}}
}
在这个例子中,当年龄小于18时,会显式抛出一个ArithmeticException
异常。
3.2 throws关键字
throws
用于在方法声明中指示该方法可能抛出的异常。其语法如下:
返回类型 方法名() throws 异常类型 {// 方法体
}
例子:
public class ThrowsExample {static void checkFile() throws IOException {throw new IOException("文件未找到");}public static void main(String[] args) {try {checkFile();} catch (IOException e) {System.out.println(e.getMessage());}}
}
在此示例中,checkFile
方法被声明为可能抛出IOException
,在main
方法中被妥善处理。
四、自定义异常
自定义异常是Java提供的一种机制,通过继承Exception
类或其子类来定义自己的异常类型。
4.1 创建自定义异常
下面是一个简单的自定义异常示例:
// 自定义异常类
class AgeInvalidException extends Exception {public AgeInvalidException(String message) {super(message);}
}public class CustomExceptionExample {static void validateAge(int age) throws AgeInvalidException {if (age < 18) {throw new AgeInvalidException("年龄必须大于或等于18岁");}}public static void main(String[] args) {try {validateAge(16);} catch (AgeInvalidException e) {System.out.println(e.getMessage());}}
}
在这个自定义异常类AgeInvalidException
中,我们可以在抛出异常时传递自定义的错误信息。
4.2 捕获自定义异常
自定义异常的捕获方式与普通异常相同,只需在try-catch
块中指定异常类型。
总结
本节中,我们深入探讨了Java异常处理机制的各个方面。了解异常与错误分类是处理Java异常的基础。我们学习了使用try-catch-finally
语句捕获和处理异常,了解了throw
和throws
关键字的使用,最后掌握了如何创建和使用自定义异常。
良好的异常处理能够提高程序的健壮性和可维护性,避免程序在运行时因未处理的异常而崩溃。掌握这些概念后,您将能够在编写Java代码时处理各种可能出现的问题,编写出更高质量的应用程序。