自定义异常类一般以Exception结尾,说明该类是一个异常类
必须继承Exception类(编译时异常),或者RuntimeException类(运行时异常)
通常在自定义异常类中添加一个带有String参数的构造方法,该参数用于存储异常的描述信息
一、 模拟用户注册
使用数组保存已经注册的用户名(数据库)
使用Scanner获取用户输入的用户名(前端页面)
定义一个方法,遍历用户数组,逐个比较(后台逻辑)
- false:继续遍历
- true:用户名已存在,抛出异常信息,提示用户 “亲,用户已被注册”
- 循环结束,没有找到重复的用户名,则提示用户 “恭喜您,注册成功”
// 异常类
public class RegisterException extends Exception {
// 构造方法赋值异常的描述信息
public RegisterException(String message) {
super(message);
}
}
// 用户类
class User {
void register() throws RegisterException {
String name = "";
System.out.println("请输入您的用户名:");
Scanner scan = new Scanner(System.in);
if (scan.hasNext()) {
name = scan.next();
}
String[] names = {"刘备", "关羽", "张飞"};
for (String s : names) {
// if (s == name) { // ==比较的是地址值
if (s.equals(name)) { // equals比较的是内容
throw new RegisterException("亲,用户已被注册");
}
}
System.out.println("恭喜您,注册成功");
}
}
二、银行网点资金
通常情况下,计算两个整数之和的方法不会有任何异常发生
对某些特殊应用程序,比如一个整数代表收入,一个整数代表支出
Bank 类中有一个 income(int in, int out) 方法, in ≥ 0, out ≤ 0,并且 in+out ≥ 0
// 异常类
public class BankException extends Exception {
String message;
// 构造方法赋值异常的描述信息
public BankException(int in, int out) {
message = "入账资金" + in + "是负数或出账资金" + out + "正数";
}
public String warnMess() {
return message;
}
}
// 银行类
public class Bank {
private int money;
public int getMoney() {
return money;
}
/**
* 计算银行收入
*
* @param in
* @param out
*/
void income(int in, int out) throws BankException {
if (in < 0 || out > 0 || in + out < 0) {
throw new BankException(in, out);
}
int netIncome = in + out;
money = money + netIncome;
System.out.println("银行纯收入:" + netIncome);
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Bank bank = new Bank();
try {
bank.income(100, -100);
bank.income(200, -100);
bank.income(-100, -100); // 发生异常,转向catch
bank.income(1000, -100); // 这行代码没有机会执行
} catch (BankException e) {
System.out.println(e.warnMess());
}
System.out.println("银行目前资金:" + bank.getMoney());
}
}
三、货船装载集装箱
如果货船超重,货船认为这是一个异常
将拒绝装载集装箱,无论是否发生异常,货船都需要正点启航
// 异常类
public class DangerException extends Exception {
// 异常的描述信息
final String message = "超重";
public String warnMess() {
return message;
}
}
// 货船类
public class CargoBoat {
private int realContent; // 真实容量
private int maxContent; // 最大容量
public void setMaxContent(int maxContent) {
this.maxContent = maxContent;
}
/**
* 货船装载货物
*
* @param temp
* @throws DangerException
*/
public void loading(int temp) throws DangerException {
realContent += temp;
if (realContent > maxContent) {
realContent -= temp; // 装不下,再卸掉货物
throw new DangerException();
}
System.out.println("目前货物容量:" + realContent);
}
}
// 测试类
public class Test {
public static void main(String[] args) {
CargoBoat boat = new CargoBoat();
boat.setMaxContent(1000); // 设置货船最大容量
int temp = 200;
try {
boat.loading(temp);
temp = 600;
boat.loading(temp);
temp = 600;
boat.loading(temp); // 发生异常,转向catch
temp = 100; // 从这开始没有机会执行
boat.loading(temp);
} catch (DangerException e) {
System.out.println(e.warnMess() + ",无法再装载" + temp + "吨的货物");
} finally {
System.out.println("货船正点起航..."); // finally 的内容一定执行
}
}
}