Java-自定义异常


1.1、概述

为什么需要自定义异常类

  • 我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常。例如年龄负数问题,考试成绩负数问题等等。
  • 在上述代码中,发现这些异常都是JDK内部定义好的,但是实际开发也会出现很多异常,这些异常很有可能在JDK中没有定义过的,那么能不能自己定义异常呢?

什么是定义异常类

  • 在开发中根据自己业务的异常情况来定义异常类。
  • 自定义一个业务逻辑异常:RegisterException。一个注册异常类。

异常类如何定义

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

使用格式

java
public class xxxException extends Exception | RuntimeException{
    添加一个空函数的构造方法
    添加一个带异常信息的构造方法
}

注意:
1.自定义异常一般都是以Exception结尾。说明类是一个异常类
2.自定义异常类,必须的继承Exception或者RuntimeException
继承Exception:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)

1.2、自定义异常–例子

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

分析:
1.使用数组保存已经注册过的用户名(数据库)
2.使用Scanner获取用户输入的注册的用户名(前端,页面)
3.定义一个方法,对输入中的注册的用户名进行判断
遍历存储已经注册过用户名和用户输入的用户名比较
true:
用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”;
false:
继续遍历比较
如果循环结束了,还没有找到重复的用户名,提示“恭喜您,注册成功!”;

java
package com.itheima.demo04.MyException;

/**
 * @date Created by 林春燕 on 2021/2/7 21:57
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
/*
    自定义异常类:
        java提供的异常类,不够我们使用,需要自己自定义一些异常类
    格式:
        public class xxxException extends Exception | RuntimeException{
            添加一个空函数的构造方法
            添加一个带异常信息的构造方法
        }
     注意:
        1.自定义异常一般都是以Exception结尾。说明类是一个异常类
        2.自定义异常类,必须的继承Exception或者RuntimeException
            继承Exception:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)
*/

public class RegisterException extends /*Exception*/RuntimeException{
    //添加一个空参数的构造方法
    public RegisterException(){
        super();
    }

/*
    添加一个带异常信息的构造方法
    查看源码发现,所有的异常类都会一个带有异常信息的构造方法,方法内部会调用父类带异常信息的构造方法,让父类来处理这个异常信息
*/
    public RegisterException(String message){
        super(message);
    }
}
java
package com.itheima.demo04.MyException;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @date Created by 林春燕 on 2021/2/7 21:56
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
/*
   要求:我们模拟注册操作,如果用户名已存在,则抛出异常提示:亲,该用户名已经被注册。
   分析:
      1.使用数组保存已经注册过的用户名(数据库)
      2.使用Scanner获取用户输入的注册的用户名(前端,页面)
      3.定义一个方法,对输入中的注册的用户名进行判断
        遍历存储已经注册过用户名和用户输入的用户名比较
            true:
                用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”;
            false:
                继续遍历比较
         如果循环结束了,还没有找到重复的用户名,提示“恭喜您,注册成功!”;
 */

public class Demo01RegisterException {
    //1.使用数组保存已经注册过的用户吗名(数据库)
    static  String[] usernames={"张三","李四","王五"};

    public static void main(String[] args) /*throws RegisterException*/ {
        //2.使用Scanner获取用户输入的注册的用户名(前端,页面)
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您要注册的用户名");
        String username=sc.next();
        checkUsername(username);
    }
    //3.定义一个方法,对用户输入中的注册的用户名进行判断
    public static void checkUsername(String username) /*throws RegisterException*/ {
        //遍历存储已经注册过用户名的数组,获取每一个用户名
        for(String name:usernames){
            //使用获取到的用户名和用户输入的用户名比较
            if (name.equals(username)){
                //true:用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”;
                try {
                    throw new  RegisterException("亲,该用户名已经被注册");
                } catch (RegisterException e) {
                    e.printStackTrace();
                    return;//结束方法
                }
            }
        }
        //如果循环结束了,还没有找到重复的用户名,提示“恭喜您,注册成功!”;
        System.out.println("恭喜您,注册成功!");
    }
}

运行效果图

Demo01RegisterException改为Demo02RegisterException

发现是效果一样的

java
package com.itheima.demo04.MyException;

import java.util.Scanner;

/**
 * @date Created by 林春燕 on 2021/2/7 21:56
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
/*
   要求:我们模拟注册操作,如果用户名已存在,则抛出异常提示:亲,该用户名已经被注册。
   分析:
      1.使用数组保存已经注册过的用户名(数据库)
      2.使用Scanner获取用户输入的注册的用户名(前端,页面)
      3.定义一个方法,对输入中的注册的用户名进行判断
        遍历存储已经注册过用户名和用户输入的用户名比较
            true:
                用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”;
            false:
                继续遍历比较
         如果循环结束了,还没有找到重复的用户名,提示“恭喜您,注册成功!”;
 */

public class Demo02RegisterException {
    //1.使用数组保存已经注册过的用户吗名(数据库)
    static  String[] usernames={"张三","李四","王五"};

    public static void main(String[] args) /*throws RegisterException*/ {
        //2.使用Scanner获取用户输入的注册的用户名(前端,页面)
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您要注册的用户名");
        String username=sc.next();
        checkUsername(username);
    }
    //3.定义一个方法,对用户输入中的注册的用户名进行判断
    public static void checkUsername(String username) /*throws RegisterException*/ {
        //遍历存储已经注册过用户名的数组,获取每一个用户名
        for(String name:usernames){
            //使用获取到的用户名和用户输入的用户名比较
            if (name.equals(username)){
                //true:用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”;
                    throw new  RegisterException(" 亲,该用户名已经被注册! ");//运行期异常无需处理,交给JVM处理,中断处理
            }
        }
        //如果循环结束了,还没有找到重复的用户名,提示“恭喜您,注册成功!”;
        System.out.println("恭喜您,注册成功!");
    }
}

运行效果图


文章作者: 浅 悦
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浅 悦 !
评论
表情 | 预览
Code -1: Request has been terminated
Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc. [N/A GET https://us.avoscloud.com/1.1/classes/Comment]
Powered By Valine
v1.3.10
 上一篇
Hexo博客matery主题 Hexo博客matery主题
这是一个采用 Material Design 和响应式设计的 Hexo 博客主题。 特性 简单漂亮,文章内容美观易读 Material Design 设计 响应式设计,博客在桌面端、平板、手机等设备上均能很好的展现 首页轮播文章及每天动
2020-12-16
下一篇 
Java-异常的处理 Java-异常的处理
Java异常处理的五个关键字:try、catch、finally、throw、throws 1.1、抛出异常throw 在编写程序时,我们必须要考虑程序出现的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法接受的参数时,首先
2020-12-13