编程自学指南:java程序设计开发,异常处理
学习目标:
-
理解异常的概念与分类
-
掌握
try-catch-finally
、throws
的用法 -
能够自定义异常并合理处理程序中的错误
-
避免异常处理中的常见反模式
一、课程引入
1.1 什么是异常?
-
生活类比:程序像“做菜”,异常就是中途发生的意外(如没煤气、食材不足)
-
核心概念:
-
异常:程序执行中的非正常情况(可恢复,如文件不存在)
-
错误(Error):严重问题(不可恢复,如内存溢出)
-
1.2 异常的分类
-
检查型异常(Checked):必须处理(如
IOException
) -
非检查型异常(Unchecked):运行时异常(如
NullPointerException
)
二、异常处理机制
2.1 try-catch块
语法
try {
// 可能抛出异常的代码
} catch (异常类型1 e) {
// 处理异常1
} catch (异常类型2 e) {
// 处理异常2
} finally {
// 无论是否异常,最终执行的代码
}
案例1:处理除零异常
try {
int a = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("除数不能为零!");
e.printStackTrace();
}
2.2 多重catch块与finally
案例2:读取文件内容
try {
FileInputStream fis = new FileInputStream("test.txt");
int data = fis.read();
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
} catch (IOException e) {
System.out.println("读取文件失败!");
} finally {
System.out.println("资源清理完成");
}
2.3 throws与throw
-
throws
:声明方法可能抛出的异常(交给调用者处理) -
throw
:主动抛出异常对象
案例3:验证用户年龄
public void setAge(int age) throws IllegalArgumentException {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数!");
}
this.age = age;
}
三、自定义异常
3.1 创建自定义异常
步骤:
-
继承
Exception
(检查型异常)或RuntimeException
(非检查型) -
定义构造方法
案例4:用户登录失败异常
// 自定义异常类
public class LoginFailedException extends RuntimeException {
public LoginFailedException(String message) {
super(message);
}
}
// 使用示例
public void login(String username, String password) {
if (!isValid(username, password)) {
throw new LoginFailedException("用户名或密码错误!");
}
}
四、综合应用与错误分析
4.1 综合案例
案例5:银行取款异常处理
public void withdraw(double amount) throws InsufficientBalanceException {
if (amount > balance) {
throw new InsufficientBalanceException("余额不足!");
}
balance -= amount;
}
// 调用处
try {
account.withdraw(1000);
} catch (InsufficientBalanceException e) {
System.out.println(e.getMessage());
}
4.2 常见错误与反模式
-
错误1:捕获异常后不做处理
try { // ... } catch (Exception e) { // 空catch块(错误!) }
-
错误2:过度宽泛的异常捕获
try { // ... } catch (Exception e) { // 应捕获具体异常 // ... }
五、总结与练习
5.1 总结
-
核心机制:
try-catch
处理异常,throws
声明异常,throw
抛出异常 -
最佳实践:
-
优先处理具体异常,避免捕获
Exception
-
自定义异常增强代码可读性
-
5.2 课后任务
-
编写程序模拟ATM取款,处理余额不足和输入非数字的异常
-
自定义一个
InvalidEmailException
,验证邮箱格式合法性 -
预习下一节课:面向对象基础
5.3 扩展挑战
-
实现一个带异常处理的文件复制工具(处理文件不存在、读写权限等问题)