目录
1、异常的概念和体系结构
1.1、异常的概念
例如:
(1)算术异常
System.out.println(10 / 0);
(2)数组越界异常
int[] arr = {1, 2, 3};
System.out.println(arr[100]);
(3)空指针异常
int[] arr = null;
System.out.println(arr.length);
1.2、 异常的体系结构
1.3 异常的分类
异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为:
注意:编译时出现的语法性错误,不能称之为异常。例如将 System.out.println 拼写错了, 写成了system.out.println. 此时编译过程中就会出错, 这是 "编译期" 出错。而运行时指的是程序已经编译通过得到class 文件了, 再由 JVM 执行过程中出现的错误。
2、异常的处理
2.1、防御式编程
1. LBYL: Look Before You Leap. 在操作之前就做充分的检查。即:事前防御型
boolean ret = false;
ret = 登陆游戏();
if (!ret) {
处理登陆游戏错误;
return;
}
ret = 开始匹配();
if (!ret) {
处理匹配错误;
return;
}
ret = 游戏确认();
if (!ret) {
处理游戏确认错误;
return;
}
ret = 选择英雄();
if (!ret) {
处理选择英雄错误;
return;
}
ret = 载入游戏画面();
if (!ret) {
处理载入游戏错误;
return;
}
缺陷:正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱。
2. EAFP: It's Easier to Ask Forgiveness than Permission. "事后获取原谅比事前获取许可更容易". 也就是先操作, 遇到问题再处理. 即:事后认错型
try {
登陆游戏();
开始匹配();
游戏确认();
选择英雄();
载入游戏画面();
...
} catch (登陆游戏异常) {
处理登陆游戏异常;
} catch (开始匹配异常) {
处理开始匹配异常;
} catch (游戏确认异常) {
处理游戏确认异常;
} catch (选择英雄异常) {
处理选择英雄异常;
} catch (载入游戏画面异常) {
处理载入游戏画面异常;
}
优势:正常流程和错误流程是分离开的, 程序员更关注正常流程,代码更清晰,容易理解代码
2.2、异常的抛出
throw new XXXException("异常产生的原因");
【注意事项】
2.3、异常的捕获
异常的捕获,也就是异常的具体处理方式。
主要有两种:异常声明throws 以及 try-catch捕获处理。
2.3.1、异常声明throws
语法格式:
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...{
}
【注意事项】
2.3.2、try-catch捕获并处理
语法格式:
public static void main(String[] args) {
try {
// 将可能出现异常的代码放在这里
} catch (要捕获的异常类型 e) {
// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到
// 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
} finally {
// 此处代码一定会被执行到
}
// 后序代码
// 当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行
// 如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行
}
finally是什么?
【异常处理的流程总结】
3、自定义异常类
例如, 我们实现一个用户登陆功能。
//用于判断用户名的异常类
public class UserNameException extends RuntimeException{
public UserNameException() {
super();
}
public UserNameException(String s) {
super(s);
}
}
//用于判断密码的异常类
public class UserPasswordException extends RuntimeException {
public UserPasswordException() {
super();
}
public UserPasswordException(String s) {
super(s);
}
}
class Login {
public String userName = "admin";
public String passWord = "123456";
public void login(String userName, String passWord) {
if(!this.userName.equals(userName)) {
//System.out.println("用户名错误!");
//使用自定义异常类来提示用户名错误
throw new UserNameException("用户名错误!");
}
if(!this.passWord.equals(passWord)) {
//System.out.println("密码错误!");
//使用自定义异常类来提示密码错误
throw new UserPasswordException("密码错误!");
}
}
}
public class Main {
public static void main(String[] args) {
try {
Login l = new Login();
l.login("admin", "123");
} catch (UserNameException | UserPasswordException e) {
e.printStackTrace();
}
}
}
【运行结果】
【注意事项】
博主推荐:
【计算机组成原理】知识点巩固 - 存储器概述-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/134482974?spm=1001.2014.3001.5502
【JavaSE】基础笔记 - 图书管理系统(保姆教程,含源码)-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/134467911?spm=1001.2014.3001.5502
【JavaSE】基础笔记 - 类和对象(下)-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/134248822?spm=1001.2014.3001.5502
如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!
如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!
如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!