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("恭喜您,注册成功!");
}
}
运行效果图

