3.1 概述

  • 一般的,用户定义的异常类都是RuntimeException的子类
  • 通常要编写几个重载的构造器
  • 同样可以通过throw抛出自定义异常类的对象
  • 自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型

为什么需要自定义异常类:

我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常类。例如年龄负数问题,考试成绩负数问题等等。

在上述代码中,发现这些异常都是JDK内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中没有定义过,例如年龄负数问题,考试成绩负数问题.那么能不能自己定义异常呢?

什么是自定义异常类:

在开发中根据自己业务的异常情况来定义异常类.

自定义一个业务逻辑异常: RegisterException。一个注册异常类。

异常类如何定义:

  1. 自定义一个编译期异常: 自定义类 并继承于java.lang.Exception
  2. 自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException

3.2 练习

要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。

首先定义一个登陆异常类RegisterException:

  1. // 业务逻辑异常
  2. public class RegisterException extends Exception {
  3. /**
  4. * 空参构造
  5. */
  6. public RegisterException() {
  7. }
  8. /**
  9. *
  10. * @param message 表示异常提示
  11. */
  12. public RegisterException(String message) {
  13. super(message);
  14. }
  15. }

模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。

  1. public class Demo {
  2. // 模拟数据库中已存在账号
  3. private static String[] names = {"bill","hill","jill"};
  4. public static void main(String[] args) {
  5. //调用方法
  6. try{
  7. // 可能出现异常的代码
  8. checkUsername("nill");
  9. System.out.println("注册成功");//如果没有异常就是注册成功
  10. }catch(RegisterException e){
  11. //处理异常
  12. e.printStackTrace();
  13. }
  14. }
  15. //判断当前注册账号是否存在
  16. //因为是编译期异常,又想调用者去处理 所以声明该异常
  17. public static boolean checkUsername(String uname) throws LoginException{
  18. for (String name : names) {
  19. if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
  20. throw new RegisterException("亲"+name+"已经被注册了!");
  21. }
  22. }
  23. return true;
  24. }
  25. }

自定义的异常类