自定义异常:
java提供的异常类,不够我们使用,需要自己定义一些异常类
格式:
public class XXException extends Exception|RuntimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
注意:
1.自定义异常类一般是以Exception结尾,说明该类是一个异常类
2.自定义异常类,必须继承Exception或者RuntimeException
继承Exception:那么自定义的异常类就是一个编译期异常,如果出现了编译期异常就必须处理,要么throws ,要么try catch
继承RuntimeException:那么自定义的异常就是一个运行期异常,无需处理,交给虚拟机处理,中断处理。
练习:我们模拟用户操作,如果已经存在该用户就提示错误,如果没有存在就提示成功了
分析:
1.使用数组保存已经注册过的用户名(数据库)
2.使用Scanner获取用户输入的注册的用户名(前端,页面)
3.定义一个方法,对用户输入的用户名进行判断
遍历已经注册的用户名数组,获取每一个用户名
使用获取到的用户名和用户输入的用户名比较
true:
用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”
false:
继续遍历数组
如果循环结束了,还没有找到重复的用户名,提示用户“恭喜您,注册成功!”
自定义MyException类
扩展Exception接口,可以自定义输出的语句
package test;
import java.util.Scanner;
public class MyException extends Exception{
//添加一个空参数的构造方法
public MyException() {
super();
}
//添加一个带异常信息的构造方法
//查看源码发现,所有异常类都会有一个带异常信息的构造方法,方法内部调用父类异常信息的构造方法,
//让父类处理
public MyException(String message){
super(message);
}
}
package test;
import java.util.Scanner;
public class DemoMyException {
static String[] s = {"张三","李四","王五"};
public static void main(String[] args) throws Exception{
System.out.println("请输入用户名:");
Scanner sc = new Scanner(System.in);
String user = sc.next();
checkName(user);
}
public static void checkName(String username) throws MyException{
for(String name: s){
if(username.equals(name)){
throw new MyException("亲,该用户名已经被注册了!");
}
}
System.out.println("恭喜您,注册成功!");
}
}
这里是Exception编译异常,所以必须要处理,因此在checkName里面会throw抛给原MyException类处理
2.如果是Extends runtimeException 可以不用throw 直接给JVM处理,如下图